Func 和委托:字段或类型

Func and delegate: field or type

我是使用预定义委托的初学者 Func。我认为这只是使用 return 类型的委托的一种简单方法。所以,我使用了这个片段:

public delegate int Comparer(object obj1, object obj2);
public Func<object, object, int> FuncComparaison;

public static event Comparer OnComparaison;
public static event FuncComparaison FuncEvent;

我在最后一行收到一条错误消息,指出 FuncComparaison 是用作类型的字段。所以:

  1. 两个声明(前两行)有什么区别?
  2. 为什么 Comparer 被视为一种类型而 FuncComparaison 不是?
  1. 第一个是委托声明。它创建了一个新的委托类型。第二个是委托类型的 public 字段。

  2. 如前所述,
  3. Comparer 是委托,FuncComparison 是字段。

Func<T1, T2, TResult> 的定义类似于

public delegate TResult Func<in T1, in T2, out TResult>(T1 param1, T2 param2);

所以它已经是一个委托,您稍后可以创建一个字段并使用它的实例。

现在你可能会明白为什么这行没有意义了:

public static event FuncComparaison FuncEvent;

因为FuncComparison不是委托类型,而是前面声明的字段名称。

public delegate int Comparer(object obj1, object obj2); 想像为定义派生自 System.Delegate 的新类型的快捷方式,稍后需要实例化并存储在某些字段中,您可能会避免这种混淆未来。

public delegate int Comparer(object obj1, object obj2); 是一个委托,它接受两个参数和 returns int.

其中

public Func<object, object, int> FuncComparaison; 是委托实例。

这里的Func是一个delegate

她的 Func 是 shorthand for public delegate int Comparer(object obj1, object obj2)

那么如何创建实例的实例呢??

这里,

  • FuncComparaison 就像一个引用变量,它将指向任何接受对象类型参数并返回 int 的方法。 因此语法为
    FuncComparaison=methodName;
  • Comparer是委托类型,需要创建它的实例指向方法
    比较器 delObj=methodName;
public delegate int Comparer(object obj1, object obj2);

这是一个类型定义。它声明了一个名为 Comparer 的新委托类型,它需要一个 return 类型的 int 和两个 object.

类型的参数

您可以通过 delegate 关键字(后跟方法签名声明)来识别委托类型定义。


public Func<object, object, int> FuncComparaison;

这是一个字段声明。它声明了一个名为 FuncComparaison 的字段,其类型为 Func<object, object, int>.


public static event Comparer OnComparaison;

这是一个事件声明。它声明(并自动实现)一个名为 OnComparaison 的事件,其类型为 Comparer。订阅方法必须具有与该委托类型兼容的签名。

您可以通过 event 关键字(后跟委托类型名称)来识别事件声明。


public static event FuncComparaison FuncEvent;

这显然应该是一个事件声明,但语法无效,因为 FuncComparaison 用在了需要委托类型名称的地方。但是,它不是委托类型,而是委托类型的字段。这类似于执行以下操作:

int foo;
foo bar;  // syntax error because `foo` is used like a type, but is not a type