C# 泛型委托重复定义-为什么?

C# 泛型委托重复定义-为什么?,c#,generics,delegates,C#,Generics,Delegates,我试图定义两个泛型委托,编译器抱怨它们是重复的,但在我看来完全不同。我做错了什么/理解错了什么 delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, IItem item); 委托TReturn foo(t参数参数,IItem项); 及 委托TReturn foo(t参数参数,int字段,IItem项); 如果我向第二个委托添加一个新的泛型参数,一切都会正常工作 delegate TReturn

我试图定义两个泛型委托,编译器抱怨它们是重复的,但在我看来完全不同。我做错了什么/理解错了什么

delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, IItem item);
委托TReturn foo(t参数参数,IItem项);

委托TReturn foo(t参数参数,int字段,IItem项);
如果我向第二个委托添加一个新的泛型参数,一切都会正常工作

delegate TReturn foo<TParameter, TField, out TReturn>(TParameter parameter, TField field, IItem item) where TField struct
委托TReturn foo(TParameter参数,TField字段,IItem项),其中TField结构

但这似乎并不正确。我将始终为字段传递一个int-它不应该是泛型。

委托不是方法。它们知道如何调用方法,但它们本身不是方法(委托是
对象
),因此不能像方法那样重载


请参阅,以了解为什么不可能的解释。

使用
delegate
关键字时,幕后发生的事情是编译器根据其定义生成一个类。因此,当您这样定义委托时:

delegate TReturn foo<TParameter, out TReturn>(TParameter parameter, IItem item);
委托TReturn foo(t参数参数,IItem项);
由此生成以下类:

class foo<TParameter, out TReturn> : MulticastDelegate
{
    public void Invoke(TParameter parameter, IItem item) { ... }
    ....
}
class foo:MulticastDelegate
{
public void Invoke(TParameter参数,IItem项){…}
....
}
如您所见,当您有两个具有相同名称和相同泛型参数的委托时,会生成两个相同的类,这当然是不可接受的


我推荐杰弗里·里克特(Jeffrey Richter)写的一本优秀的书,该书对像这样的幕后工作有了更多的了解。确切的编译错误是什么?错误是“名称空间‘xxx’已经包含了‘foo’的定义”。这有点道理,但我不能真正解释它。我认为你可以通过删除这里的泛型来简化这个问题。假设您有两个委托:
delegate void f()
delegate void f(int)
,然后您得到一个委托对象:
fa,您将不知道从哪个版本的委托实例化此对象。调用
a(1)
a()。因此,委托不同于可以重载的方法
class foo<TParameter, out TReturn> : MulticastDelegate
{
    public void Invoke(TParameter parameter, IItem item) { ... }
    ....
}