egl*_*ius 34

您可以使用以下任何一种:

public delegate double CustomerDelegate(int test);
public interface ITest
{
    EventHandler<EventArgs> MyHandler{get;set;}
    CustomerDelegate HandlerWithCustomDelegate { get; set; }
    event EventHandler<EventArgs> MyEvent;
}
Run Code Online (Sandbox Code Playgroud)

  • 很难理解像Func <int,string [],bool>这样的参数.为该签名命名更有意义. (9认同)
  • 为什么在只使用Func <int,double>时创建CustomerDelegate? (5认同)
  • 在COM中工作时,您实际上必须使用自己的委托,因为您无法编组Func <>,EventHandler <>,Action <>等泛型类型. (4认同)

Jon*_*len 24

委托只是另一种类型,因此您不会通过将其置于界面中来获得任何东西.

您不需要创建自己的代理.大多数情况下,您应该只使用EventHandler,Func,Predicate或Action.

请问您的代表是什么样的?

  • 这个答案实际上也解决了我的问题,即在我想使用它们的情况下,我永远找不到使用委托的好方法.即不要使用'm :). (2认同)

Mat*_*att 8

这是一个代表TYPE decalaration ...

public delegate returntype MyDelegateType (params)
Run Code Online (Sandbox Code Playgroud)

这不能在接口中声明,因为它是一个类型声明

但是使用上面的类型声明,您可以使用委托实例

MyDelegateType MyDelegateInstance ( get; set;)
Run Code Online (Sandbox Code Playgroud)

所以委托实例没问题,但委托类型声明不是(在界面中)


cgr*_*eno 7

代表是一个类型,其不能在界面中声明.您可能希望使用事件(如果适用)或在接口外部但在同一名称空间中声明委托.

此链接可能有所帮助 - 何时使用代理而不是接口


Guf*_*ffa 5

文档清楚地说明您可以在接口中定义委托:

接口仅包含方法、委托或事件的签名。

MSDN:接口(C# 参考)

但是,在同一页面的注释中,它说接口可以包含方法、属性、索引器和事件的签名。

如果您尝试在接口中放置委托,编译器会说“接口不能声明类型”。

Ecma-334 标准(8.9 接口)同意该页和编译器上的注释。

  • 这看起来像是 MSDN 中的错误。那应该是“方法、属性或事件的签名”,不是吗? (2认同)