你能用'delegate'但两者都不能'Action'或& # 39;func # 39

本文关键字:Action func 都不能 delegate | 更新日期: 2023-09-27 18:06:37

提前道歉新手类问题(因为我是c#的新手):

在研究委托时,在我看来,ActionFunc的组合涵盖了delegate关键字的整个"功能"。

换句话说,你不能用ActionFunc来做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);

我错了吗?如果是,你能提供一个反例吗?

你能用'delegate'但两者都不能'Action'或& # 39;func # 39

您需要使用ActionFunc以外的委托,如果您想:

  1. 任意refout参数

  2. params参数

  3. 可选参数

  4. 任何泛型参数的约束。(确保参数是扩展类型的任何类型,它具有无参数构造函数,它是值/引用类型,等等)

  5. 方法签名中使用的unsafe类型,如指针作为参数。

  6. 有一个不是逆变的参数,或者一个不是协变的返回类型。FuncAction都尽可能地应用变异,所以如果重要的是你的委托不是是变异的,你将需要你自己的。

您可以创建接受refout参数的委托。不能定义具有refout参数的FuncAction

例如:

delegate void MyDelegate(ref string val);

不能表示为Action

我的两分话:有了你自己的泛型委托,你可以应用FuncAction不提供的泛型约束

delegate void MyDelegate<T>(T input) where T : struct;

编译器将确保MyDelegate<T>的值类型和T一样,引用类型是不允许的。