Func和delegate:字段或类型

时间:2015-03-12 08:05:53

标签: c# .net delegates

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

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被视为不是?

4 个答案:

答案 0 :(得分:1)

  1. 第一个是委托声明。它创建一个新的委托类型。第二个是委托类型的公共领域。

  2. Comparer是一个代表,FuncComparison是一个字段,如前所述。

  3. 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派生的新类型的快捷方式,以后需要实例化并存储在某些字段中,您可能会在将来避免此类混淆。

答案 1 :(得分:1)

public delegate int Comparer(object obj1, object obj2);是一个委托,它接受两个参数并返回int

其中

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

这里Func是delegate

她的Func是public delegate int Comparer(object obj1, object obj2)的简写。

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

答案 2 :(得分:1)

public delegate int Comparer(object obj1, object obj2);

这是一种类型定义。它声明了一个名为Comparer的新委托类型,它要求返回类型为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

答案 3 :(得分:0)

下面,

  • FuncComparaison 就像一个引用变量,它将指向任何接受对象类型和参数的参数的方法。返回int。 所以语法为 FuncComparaison = methodName ;
  • Comparer 是委托类型,您需要创建一个实例来指向某个方法。
    Comparer delObj = methodName ;