未调用我的重载泛型方法
本文关键字:泛型方法 重载 我的 调用 | 更新日期: 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)
我的问题是,为什么我调用了错误的重载,以及如何强制语言调用我想要的重载?
谢谢你的帮助!
我不想抄整篇文章。因此,相关的要点是:
我们做一次过载解析,然后烘焙结果。
因此,C#编译器在编译RegisterAppendReceiver时决定要调用哪个重载"GetAppendReceiver.Get"。由于在这一点上,它对DataType唯一知道的是DataType可以是任何东西,所以它在调用AppendReceiver的重载时进行编译。DataProcessor,而不是AppendReceiver。数据处理器。
相比之下,C++编译器没有这种行为。每次进行泛型调用时,编译器都会重新进行替换。这就是C++编译器比C#编译器慢得多的原因之一。