我知道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的应用程序到相关参数上。 通常,将一个属性集合应用于虚方法的参数,然后在具有不同属性集的派生类中的重写方法中装饰“对应”参数是没有问题的。 […]
我有以下方法: void MyMethod(params object[] args) { } 我试图用object[]类型的参数调用它: object[] myArgs = GetArgs(); MyMethod(myArgs); 它编译得很好,但在MyMethod I args == { myArgs} ,即一个数组,其中一个元素是我的原始参数。 显然我想拥有args = myArgs ,我做错了什么? 编辑: Jon Skeet实际上是正确的, GetArgs()确实将事物包装在一个元素数组中,对不起愚蠢的问题。
向所有人提出问题C#向导。 我有一个方法,称之为myFunc,它需要可变长度/类型参数列表。 myFunc本身的参数签名是myFunc(params object[] args) ,我在列表上使用reflection(例如,想想这有点像printf)。 我想以myFunc(new int[] { 1, 2, 3 })区别对待myFunc(1, 2, 3) myFunc(new int[] { 1, 2, 3 }) 。 也就是说,在myFunc的主体内,我想枚举我的参数的类型,并希望最终得到{int,int,int}而不是int []。 现在我得到了后者:实际上,我无法区分这两种情况,它们都以int []的forms出现。 我希望前者会显示为obs []。长度= 3,obs [0] = 1等。 而且我曾预料到后者会显示为obs []。长度= 1,其中obs [0] = {int [3]} 这可以做到,还是我问不可能?