未调用我的重载泛型方法

本文关键字:泛型方法 重载 我的 调用 | 更新日期: 2023-09-27 17:59:25

我在我的一个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>是一个抽象类,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 中简明扼要地回答了这个问题

我不想抄整篇文章。因此,相关的要点是:

我们做一次过载解析,然后烘焙结果。

因此,C#编译器在编译RegisterAppendReceiver时决定要调用哪个重载"GetAppendReceiver.Get"。由于在这一点上,它对DataType唯一知道的是DataType可以是任何东西,所以它在调用AppendReceiver的重载时进行编译。DataProcessor,而不是AppendReceiver。数据处理器。

相比之下,C++编译器没有这种行为。每次进行泛型调用时,编译器都会重新进行替换。这就是C++编译器比C#编译器慢得多的原因之一。