这一定是一个简单的问题。我定义了两种委托类型:
delegate void TestHandler(object sender, EventArgs args);
delegate void TestHandlerGen<TArgs>(object sender, TArgs args);
然后我用它们:
TestHandler h1 = null;
TestHandlerGen<EventArgs> h2 = delegate { };
// this compiles
h1 = new TestHandler(h2);
// this doesn't compile:
// Cannot implicitly convert type 'X.TestHandlerGen<System.EventArgs>'
// to 'X.TestHandler'
h1 = h2;
删除标签具有相同的签名,为什么h1 = h2
无法编译?
为什么h1 = new TestHandler(h2)
编译得很好?
答案 0 :(得分:3)
来自规范:
15.1委托声明
C#中的委托类型是名称等价的,在结构上不等同。 具体来说,两个不同的委托类型具有相同的 参数列表和返回类型被视为不同的委托 类型
第一个示例有效,因为您可以从兼容的委托实例创建新委托。因此,虽然h2
与h1
兼容,但它不相同,因为它们具有不同的类型:
7.6.10.5委托创建表达式
delegate-creation-expression用于创建a的新实例 委托型。委托创建表达式:
新委托类型(表达式)
委托创建表达式的绑定时处理 形成newD(E),其中D是委托类型,E是表达式, 包括以下步骤:
•如果E是一个值,E必须与D兼容(第15.1节)和结果 是对新创建的D类委托的引用 与E相同的调用列表。如果E与D不兼容,则a 发生编译时错误。