提前为 newbie 提出道歉问题(因为我是C#中的一员):
在研究代表时,在我看来,Action
和Func
的组合涵盖了整个"功能" delegate
关键字。
换句话说,您无法使用delegate
关键字执行任何操作,但无法使用Action
或Func
。
我已尝试过以下示例(效果很好):
Func<int,int,int,int> func = (x,y,z) => (x<<9)|(y<<6)|(z<<3);
Action<int,int,int> action = (x,y,z) => Console.WriteLine(x|y|z);
我错了吗?如果是,那么请您提供一个反例吗?
答案 0 :(得分:6)
如果您想要的话,您需要使用Action
或Func
以外的代理:
您方法的参数超过16个。
任何参数均为ref
或out
参数。
params
参数。
您的任何参数的可选参数。
对任何通用参数的约束。 (确保参数是扩展类型的任何类型,它具有无参数构造函数,它是值/引用类型等。)
unsafe
在方法签名中使用的类型,例如指针作为参数。
有一个不是逆变的参数,或者不协变的返回类型。 Func
和Action
都会尽可能地应用差异,因此如果您的代理不很重要,那么您需要自己的变体。
答案 1 :(得分:2)
您可以创建带有ref
或out
参数的代理。您无法定义具有Func
或Action
参数的ref
或out
。
例如:
delegate void MyDelegate(ref string val);
不能表示为Action
。
答案 2 :(得分:1)
我的两分钱:使用您自己的通用代表,您可以应用Func
或Action
delegate void MyDelegate<T>(T input) where T : struct;
编译器会确保MyDelegate<T>
的值类型始终为T
,不允许使用引用类型。