繁体   English   中英

params数组可以作为C#中列表的保持类型吗?

[英]Can a params array be a holding type for a list in C#?

params []变量是否可以保存一个列表,该列表已作为参数通过C#中的方法传递?

写了一个方法(AddIntegers),需要将多个值作为参数。 在方法的参数列表中,当在Main方法中进行方法调用时,有一个params []变量正在接收抛出的值。 但有一个例外,说“无法从system.collections.generic.List <>转换为整数。任何人都知道为什么会发生这种情况?

       **** this is within the Main Method**** 
        string Demostring = Console.ReadLine();
        string[] tokens = Demostring.Split(',');
        List<int> nums = new List<int>();
        int oneNum;
        foreach(string s in tokens)
        {
            if (Int32.TryParse(s, out oneNum))
                nums.Add(oneNum);
        }

        int result1 = AddIntegers(nums);

        **** this is the method to be called****
        public static int AddIntegers(params int[] Restnum)
        {
            int result = 0;

            foreach(int temp in Restnum)
            {
                result += temp;
            }

             return result;
         }

不, List<int>不是int[] ,因此您不能将它用作int[]参数的参数。 (事实上​​,它是一个参数数组不会改变它。)

通常,解决方案是有两个重载 - 一个接受参数数组,另一个接受IEnumerable<T>

public static int AddIntegers(params int[] numbers) =>
    AddIntegers((IEnumerable<int>) numbers);

public static int AddIntegers(IEnumerable<int> numbers)
{
    ...
}

请注意,对于此特定示例,您当然可以从LINQ调用Sum扩展方法到Objects。

有些建议让参数数组能够接受IReadOnlyList<T>而不仅仅是T[] ,但这还不在C#中。 (亲爱的,我会爱上它的。)

这是因为您尝试在数组参数中插入List。

而不是这个:

int result1 = AddIntegers(nums);

你可以这样做:

int result1 = AddIntegers(nums.ToArray());

或者:

public static int AddIntegers(List<int> numbers)
{
     return AddIntegers(numbers.ToArray());
}

public static int AddIntegers(params int[] Restnum)
{
    int result = 0;

    foreach(int temp in Restnum)
    {
        result += temp;
    }

    return result;
}

然后像平时那样打电话。

private void button4_Click(object sender, EventArgs e)
        {
            const string demostring = "1,2,3,4,5,6";
            var tokens = demostring.Split(',');
            var nums = new List<int>();
            foreach (var s in tokens)
                if (int.TryParse(s, out var oneNum))
                    nums.Add(oneNum);

            var result1 = AddIntegers(nums);
        }
        public static int AddIntegers(List<int> restnum)
        {
            var result = 0;

            foreach (var temp in restnum)
                result += temp;

            return result;
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM