我是初学者,使用预定义的委托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
是一个用作类型的字段。所以:
Comparer
被视为某种类型而FuncComparaison
被视为不是?答案 0 :(得分:1)
第一个是委托声明。它创建一个新的委托类型。第二个是委托类型的公共领域。
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
派生的新类型的快捷方式,以后需要实例化并存储在某些字段中,您可能会在将来避免此类混淆。
答案 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)
下面,