在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