为了自动将代码从C ++转换为C#,我希望有一个C#类(伪代码)
class Null {
public static implicit operator T (Null unused) {
return null;
}
}
这在
等情况下很有用foo(T1 x) { ... }
foo(T2 x) { ... }
foo(null); // ambiguous
出于某些原因,通常不可能以编程方式消除上述类型的歧义。 E.g。
foo((T1)null); // Discovering T1 over T2 is not possible or really hard to do
但如果我上面有Null
课程,我可以通过编程方式添加
foo(Null x) {...}
并生成
foo(new Null()); // not ambiguous
诀窍是使用new Null()
代替每个生成的null
,甚至
T1 x = new Null();
使用x == null
进行编译。
是否可以写这样的课程?
答案 0 :(得分:1)
没有。如果没有dynamic
关键字,C#中的所有方法绑定都在编译时完成 - 甚至绑定到隐式转换运算符。这意味着您使用方法重载解决方案遇到的问题也会阻止编译器确定您是否希望将null
隐式强制转换为T1或T2。使用dynamic
无法正常工作,因为null
在运行时没有任何类型。
如果您可以分享更多信息,可能还有其他解决方案可以解决您的问题。例如,如果两个方法中的任何一个在传递空值时都能正常工作,并且您只是想让生成的代码进行编译,那么您可以创建一个这样的方法:
foo(object o) {return Foo((T1)null);}
然后将来电转换为:
foo(new object());
如果您想使用Null
类而不是object
,上述方法也可以使用 - 不需要隐式转换。
另一方面,如果确实重要的是使用空值调用哪个重载,那么您需要告诉我们原始程序如何确定要调用哪个。