C# 未调用我的重载泛型方法
我在我的一个C#项目中编写了这段代码:C# 未调用我的重载泛型方法,c#,generics,overloading,C#,Generics,Overloading,我在我的一个C#项目中编写了这段代码: 注册表AppendReceiver调用示例: myObject.RegisterAppendReceiver(myMethod); 其中myMethod的定义如下: public void writeMessage(string strMessageIn) 我的问题是为什么调用了错误的重载,以及如何强制语言调用我想要的重载 谢谢你的帮助 Eric Lippert在他的文章中简洁地回答了这个问题 我不想复制整篇文章。因此,相关的一点是: 我们做一次重载解
注册表AppendReceiver
调用示例:
myObject.RegisterAppendReceiver(myMethod);
其中myMethod
的定义如下:
public void writeMessage(string strMessageIn)
我的问题是为什么调用了错误的重载,以及如何强制语言调用我想要的重载
谢谢你的帮助 Eric Lippert在他的文章中简洁地回答了这个问题 我不想复制整篇文章。因此,相关的一点是: 我们做一次重载解析,然后烘焙结果 因此,C#编译器在编译RegisterAppendReceiver时决定将调用哪个“GetAppendReceiver.Get”重载。因为,在这一点上,它只知道数据类型可以是任何东西,所以它在对重载的调用中编译,重载采用AppendReceiver.DataProcessor,而不是AppendReceiver.DataProcessor
比较之下,C++编译器的行为不是这样的。每次进行泛型调用时,编译器都会重新进行替换。这是C++编译器比C编译器慢得多的原因。< / P>好,我理解其中的差异,谢谢你的解释。有没有一种方法可以通过C实现我的目标?根据Eric的文章,dynamic可以做到这一点,但它将在运行时而不是编译时解析类型。只要性能不是问题,这就行了。@AMDG在这种情况下,您也可以简单地使用继承。在我看来,这似乎是抽象工厂模式的经典示例——GoF完美地描述了如何使用标准继承来实现这一点。@atlaste什么是GoF?“四人帮”——它通常用作设计模式“标准”书籍的缩写:(右边的那本)
myObject.RegisterAppendReceiver(myMethod);
public void writeMessage(string strMessageIn)