你能做些什么吗?委托'但不能与“行动”相关联。或者' Func&#39 ;?

时间:2014-06-04 16:48:46

标签: c# delegates

提前为 newbie 提出道歉问题(因为我是C#中的一员):

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

换句话说,您无法使用delegate关键字执行任何操作,但无法使用ActionFunc

我已尝试过以下示例(效果很好):

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);

我错了吗?如果是,那么请您提供一个反例吗?

3 个答案:

答案 0 :(得分:6)

如果您想要的话,您需要使用ActionFunc以外的代理:

  1. 您方法的参数超过16个。

  2. 任何参数均为refout参数。

  3. params参数。

  4. 您的任何参数的可选参数。

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

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

  7. 有一个不是逆变的参数,或者协变的返回类型。 FuncAction都会尽可能地应用差异,因此如果您的代理很重要,那么您需要自己的变体。

答案 1 :(得分:2)

您可以创建带有refout参数的代理。您无法定义具有FuncAction参数的refout

例如:

delegate void MyDelegate(ref string val);

不能表示为Action

答案 2 :(得分:1)

我的两分钱:使用您自己的通用代表,您可以应用FuncAction

未提供的generic constraints
delegate void MyDelegate<T>(T input) where T : struct;

编译器会确保MyDelegate<T>的值类型始终为T,不允许使用引用类型。