Tho*_*ing 5 c# implicit-conversion
为了自动将代码从C++转换为C#,我希望有一个C#类(伪代码)
class Null {
public static implicit operator T (Null unused) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这在诸如此类的情况下非常有用
foo(T1 x) { ... }
foo(T2 x) { ... }
foo(null); // ambiguous
Run Code Online (Sandbox Code Playgroud)
出于某些原因,通常不可能以编程方式消除上述类型的歧义.例如
foo((T1)null); // Discovering T1 over T2 is not possible or really hard to do
Run Code Online (Sandbox Code Playgroud)
但如果我Null上面的课程,我可以通过编程方式添加
foo(Null x) {...}
Run Code Online (Sandbox Code Playgroud)
并生成
foo(new Null()); // not ambiguous
Run Code Online (Sandbox Code Playgroud)
诀窍是使用new Null()代替每个生成的null甚至
T1 x = new Null();
Run Code Online (Sandbox Code Playgroud)
编译x == null.
是否可以写这样的课程?
不会。如果没有dynamic关键字,C# 中的所有方法绑定都是在编译时完成的——甚至绑定到隐式转换运算符。这意味着您在方法重载解析中遇到的问题也会阻止编译器确定您是否希望null隐式转换为 T1 还是 T2。并且使用dynamic不会起作用,因为null在运行时没有任何类型。
如果您可以分享更多信息,那么您的问题可能还有其他解决方案。例如,如果两种方法中的任何一种在传递空值时都可以正常工作,并且您只是尝试编译生成的代码,则可以创建如下方法:
foo(object o) {return Foo((T1)null);}
Run Code Online (Sandbox Code Playgroud)
然后将调用转换为:
foo(new object());
Run Code Online (Sandbox Code Playgroud)
如果您想使用Null类而不是object--no 隐式强制转换,则上述方法也适用。
另一方面,如果使用空值调用哪个重载确实很重要,那么您需要告诉我们原始程序如何确定要调用哪个重载。
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |