你能用'delegate'但两者都不能'Action'或& # 39;func # 39
本文关键字:Action func 都不能 delegate | 更新日期: 2023-09-27 18:06:37
提前道歉新手类问题(因为我是c#的新手):
在研究委托时,在我看来,Action
和Func
的组合涵盖了delegate
关键字的整个"功能"。
换句话说,你不能用Action
或Func
来做delegate
关键字。
我试过下面的例子(工作良好):
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);
我错了吗?如果是,你能提供一个反例吗?
您需要使用Action
或Func
以外的委托,如果您想:
-
任意
ref
或out
参数 -
params
参数 -
可选参数
-
任何泛型参数的约束。(确保参数是扩展类型的任何类型,它具有无参数构造函数,它是值/引用类型,等等)
-
方法签名中使用的
unsafe
类型,如指针作为参数。 -
有一个不是逆变的参数,或者一个不是协变的返回类型。
Func
和Action
都尽可能地应用变异,所以如果重要的是你的委托不是是变异的,你将需要你自己的。
您可以创建接受ref
或out
参数的委托。不能定义具有ref
或out
参数的Func
或Action
。
delegate void MyDelegate(ref string val);
不能表示为Action
我的两分话:有了你自己的泛型委托,你可以应用Func
或Action
不提供的泛型约束
delegate void MyDelegate<T>(T input) where T : struct;
编译器将确保MyDelegate<T>
的值类型和T
一样,引用类型是不允许的。