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
是用作类型的字段。所以:
- 两个声明(前两行)有什么区别?
- 为什么
Comparer
被视为一种类型而 FuncComparaison
不是?
第一个是委托声明。它创建了一个新的委托类型。第二个是委托类型的 public 字段。
如前所述,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
我是使用预定义委托的初学者 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
是用作类型的字段。所以:
- 两个声明(前两行)有什么区别?
- 为什么
Comparer
被视为一种类型而FuncComparaison
不是?
第一个是委托声明。它创建了一个新的委托类型。第二个是委托类型的 public 字段。
如前所述,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