varargs / params object []但区分实际对象[]输入和varargs输入(s)

时间:2018-04-11 14:41:16

标签: c# .net arrays object optional-parameters

在C#.NET中,object用于多类型参数,允许传递整数,字符串,字符等作为可能的输入。例如:

// Can be called like: `F(2)`, `F("test")`, `F('a')`, etc.
void F(object arg){ ... }

C#.NET也可以具有固定大小的可选参数。例如:

// Can be called like: `F()`, `F(2)`, `F("test")`, `F('a')`, etc.
void F(object arg = null){ ... }

还有varargs,这是一个未定义的可选参数(这是我在这个答案中使用的)。例如:

// Can be called like: `F()`, `F(2)`, `F(2, "test", 'a')`, etc.
void F(params object[] args){ ... }

通常lambda是这样创建的:

System.Func<object[], int> F f = a=>a.Length;
// A call like `f(new object[]{2, "test", 'a'))` will return 3 (size of the input array)

但遗憾的是System.Func不支持params varargs,因此我必须改为创建delegate

delegate int F(params object[] args);
F f = a=>a.Length;
// A call like `f()` will return 0, and `f(2, "test", 'a')` will return 3

关于我的问题:有没有办法知道我是否输入了实际object[]而不是varargs?

所以对于上面的最终lambda,如何让输入f(new object[]{2,"test",'a'});的结果为1而不是3?

有点像f(new int[]{1,2,3});将给出1的结果,因为它将整个整数数组解释为单个对象。如何使用C#.NET varargs将整个对象数组作为单个对象?除了使用params之外,还有其他方法可以在C#.NET中输入varargs吗?

我知道我可以像f((object)new object[]{2,"test",'a'});那样输入结果为1,但是如果不改变输入类型f(new object[]{2,"test",'a'});,有没有办法返回1而不是3(这在C#中是否可能! .NET)?

我尝试了这个,但不幸的是(当然还有预期)它仍然会返回3

a=>((object[])(object)a).Length

0 个答案:

没有答案