Tag: params keyword

重载,generics类型推断和’params’关键字

我刚注意到一个带有重载决策的奇怪行为。 假设我有以下方法: public static void DoSomething(IEnumerable items) { // Whatever // For debugging Console.WriteLine(“DoSomething(IEnumerable items)”); } 现在,我知道这个方法通常会使用少量显式参数调用,所以为方便起见,我添加了这个重载: public static void DoSomething(params T[] items) { // Whatever // For debugging Console.WriteLine(“DoSomething(params T[] items)”); } 现在我尝试调用这些方法: var items = new List { “foo”, “bar” }; DoSomething(items); DoSomething(“foo”, “bar”); 但在这两种情况下,都会调用params的重载。 我希望在List的情况下调用IEnumerable重载,因为它看起来更匹配(至少对我而言)。 这种行为是否正常? 谁能解释一下呢? 我在MSDN文档中找不到任何关于它的明确信息……这里涉及的重载决策规则是什么?

在方法覆盖中更改params修饰符

我知道params修饰符(将数组类型的一个参数转换成所谓的“参数数组”)特别不是方法签名的一部分。 现在考虑这个例子: class Giraffid { public virtual void Eat(int[] leaves) { Console.WriteLine(“G”); } } class Okapi : Giraffid { public override void Eat(params int[] leaves) { Console.WriteLine(“O”); } } 编译时没有任何警告。 然后说: var okapi = new Okapi(); okapi.Eat(2, 4, 6); // will not compile! 给出一个错误( No overload for method ‘Eat’ takes 3 arguments )。 现在,我知道编译器将params修饰符转换为System.ParamArrayAttribute的应用程序到相关参数上。 通常,将一个属性集合应用于虚方法的参数,然后在具有不同属性集的派生类中的重写方法中装饰“对应”参数是没有问题的。 […]

使用C#的XML注释cref属性和params语法

在C#中,我试图使用来引用包含params关键字的方法签名。 我知道这会将参数列表转换为数组,但我甚至无法弄清楚如何在CREF属性中引用数组。 我在搜索中找不到任何内容,也没有人知道任何想法。 编译器在方括号上窒息。 我已经尝试了各种不同的组合,使用花括号,使用Array类,但没有任何工作。 有谁知道这个?