为什么C#允许只有方法的最后一个参数是"可变长度"

Tom*_*duy 6 .net c# parameters methods

据我所知,C#允许只有方法的最后一个参数是"可变长度",例如:

T f(A a, params B[] b)允许,如果你有,A r; .... B x, y, z; ....你可以打电话给像f (r, x, y, z).为什么C#也没有定义类似的东西:

T f(params A[] a, params B[] b)
Run Code Online (Sandbox Code Playgroud)

Ed *_* S. 12

因为编译器如何知道第一个参数的变量参数何时停止?

请告诉我什么argOne,argTwo应该包含在方法体内:

void Foo( params object[] argOne, params object[] argTwo )
{
    // whatever
} 

Foo( 1, false, "Hello", new object(), 2.3 );
Run Code Online (Sandbox Code Playgroud)

  • 如果我是OP,我会回答编译器不会编译这些不明显的情况,但编译了一些更确定的例如`params int [] a,params string [] b` ;-) (4认同)

SLa*_*aks 9

因为确定何时实际允许这样的结构太复杂了.
(当呼叫明确时)
虽然可以创建一套好的规则,但它们会相当复杂且难以理解.人们最终会问为什么案例X不起作用,如果它有一个微妙的含糊不清.

例如:

  • 这两种类型都不能是接口或通用参数
  • 如果一个类型是枚举或数字类型,则另一个类型必须是objector 以外的类Enum
  • 如果一个类型是委托,另一个类型也不能是委托类型(也不objectDelegate,也不是MulticastDelegate)
  • 一种类型不能继承另一种
  • 所有这些规则都适用于可隐式转换为参数类型的任何类型
  • 两种类型必须是sealed或必须是值类型

(其中一些规则可以在呼叫站点强制执行)

在实践中,这样的特征会有很多限制,几乎一文不值.

因此,此功能将从-10,000点开始.

它还将创造一个全新的突破性变化类别.启封类型,添加隐式转换或其他看似微不足道的事情现在可能会破坏客户端代码.