我重载的泛型方法没有被调用

My overloaded generic method is not called

我在我的一个 C# 项目中写了这段代码:

public static class GetAppendReceiver
{
    public static AppendReceiver<DataType> Get<DataType>(AppendReceiver<DataType>.DataProcessor processor0, int delayIn = 0)
    {
        throw new InvalidOperationException();
    }

    public static AppendReceiver<string> Get(AppendReceiver<string>.DataProcessor processor0, int delayIn = 0)
    {
        return new StringAppendReceiver(processor0, delayIn);
    }
}

public abstract class AppendReceiver<DataType>
{
    public delegate void DataProcessor(DataType data);
    ...
}

AppendReceiver<DataType> 是抽象 class,DataProcessor 是委托类型。

当用字符串 DataProcessor 调用 GetAppendReceiver.Get 时,我希望调用重载函数,但我得到 InvalidOperationException.

这是我的电话:

class ClassA<DataType>
{
    public void RegisterAppendReceiver(AppendReceiver<DataType>.DataProcessor receiver)
    {
        appendReceivers.Add(GetAppendReceiver.Get(receiver, Delay));
    }
}

RegisterAppendReceiver 调用示例:

myObject.RegisterAppendReceiver(myMethod);

其中myMethod定义如下:

public void writeMessage(string strMessageIn)

我的问题是为什么调用了错误的重载,以及如何强制语言调用我想要的重载?

感谢您的帮助!

Eric Lippert 在他的文章中简洁地回答了这个问题Generics are not Templates

我不想复制整篇文章。所以相关的一点是:

We do the overload resolution once and bake in the result.

因此 C# 编译器会在编译 RegisterAppendReceiver 时决定调用 "GetAppendReceiver.Get" 的哪个重载。由于此时它对 DataType 的唯一了解是 DataType 可以是任何东西,因此它在对采用 AppendReceiver.DataProcessor 而不是 AppendReceiver.DataProcessor.[=12 的重载的调用中进行编译=]

相比之下,C++ 编译器不会这样做。每次进行通用调用时,编译器都会重新进行替换。这是 C++ 编译器比 C# 编译器慢得多的原因之一。