JavaScript spread syntax in C#

后端 未结 4 591
刺人心
刺人心 2021-01-01 10:26

Is there any implementation in C# like JavaScript\'s spread syntax?

var arr = new []{
   \"1\",
   \"2\"//...
};

Console.WriteLine(...arr);
4条回答
  •  余生分开走
    2021-01-01 11:25

    There isn't a spread option. And there are reasons.

    1. Properties aren't an array in C# unless you use the params keyword
    2. Properties that use the param keyword would have to either:
      1. Share the same type
      2. Have a castable shared type such as double for numerics
      3. Be of type object[] (as object is the root type of everything)

    However, having said that, you can get similar functionality with various language features.

    Answering your example:

    C#

    var arr = new []{
       "1",
       "2"//...
    };
    
    Console.WriteLine(string.Join(", ", arr));
    

    The link you provide has this example:

    Javascript Spread

    function sum(x, y, z) {
      return x + y + z;
    }
    
    const numbers = [1, 2, 3];
    
    console.log(sum(...numbers));
    // expected output: 6
    
    console.log(sum.apply(null, numbers));
    

    Params In C#, with same type

    public int Sum(params int[] values)
    {
         return values.Sum(); // Using linq here shows part of why this doesn't make sense.
    }
    
    var numbers = new int[] {1,2,3};
    
    Console.WriteLine(Sum(numbers));
    

    In C#, with different numeric types, using double

    public int Sum(params double[] values)
    {
         return values.Sum(); // Using linq here shows part of why this doesn't make sense.
    }
    
    var numbers = new double[] {1.5, 2.0, 3.0}; // Double usually doesn't have precision issues with small whole numbers
    
    Console.WriteLine(Sum(numbers));
    

    Reflection In C#, with different numeric types, using object and reflection, this is probably the closest to what you are asking for.

    using System;
    using System.Reflection;
    
    namespace ReflectionExample
    {
        class Program
        {
            static void Main(string[] args)
            {
                var paramSet = new object[] { 1, 2.0, 3L };
                var mi = typeof(Program).GetMethod("Sum", BindingFlags.Public | BindingFlags.Static);
                Console.WriteLine(mi.Invoke(null, paramSet));
            }
    
            public static int Sum(int x, double y, long z)
            {
                return x + (int)y + (int)z;
            }
        }
    }
    

提交回复
热议问题