【发布时间】:2012-01-20 11:42:57
【问题描述】:
class Poly
{
public static void WriteVal(int i) { System.Console.Write("{0}\n", i); }
public static void WriteVal(string s) { System.Console.Write("{0}\n", s); }
}
class GenWriter<T>
{
public static void Write(T x) { Poly.WriteVal(x); }
}
为什么在 C# 中不能接受无辜的(针对 C++ 程序员的)方法 Write?
可以看到编译器尝试将参数类型T匹配到具体的重载之前实例化:
错误 3 'TestGenericPolyMorph.Poly.WriteVal(int)' 的最佳重载方法匹配有一些无效参数
当然。目的不是像上面那样使用静态方法,目的是创建一个具有多态行为的包装器。 注意:我使用的是 VS 2010。
请注意,所有需要的信息都在编译时可用。再说一遍:问题是验证是在模板实例化之前执行的。
讨论后补充:
好吧,可能是我没有正确强调这一点。 问题不仅在于泛型和模板之间的区别,还在于解决以下问题:给定一组针对不同类型的重载,我想生成一组包装类,为这些类型提供虚拟方法(多态性)。 在运行时解析虚拟方法的代价是最小的并且不会影响性能。这就是 C++ 模板派上用场的地方。显然,dynamic 的运行时类型解析的开销是完全不同的。 因此,问题是是否可以在不复制代码且不支付性能损失的情况下将现有重载转换为多态(例如,我不确定 dynamic 与“switch”试图强制转换,除了更好的语法)。
到目前为止,我看到的解决方案之一是生成/发出代码(原文如此!),即自动执行此操作而不是剪切和粘贴。
因此,我们不使用 C++ 模板处理,而是简单地手动进行或重新发明宏/模板处理器。
还有更好的吗?
【问题讨论】:
-
"问题是验证是在模板实例化之前进行的。" - 是的,这是真的。你不能在 C# 中这样做,因为编译器在编译时不知道 x 的类型。
标签: c# generics polymorphism overloading