我重载的泛型方法没有被调用
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# 编译器慢得多的原因之一。
我在我的一个 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# 编译器慢得多的原因之一。