C#泛型隐式运算符返回类型

时间:2014-07-31 18:04:10

标签: c# implicit-conversion

为了自动将代码从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进行编译。

是否可以写这样的课程?

1 个答案:

答案 0 :(得分:1)

没有。如果没有dynamic关键字,C#中的所有方法绑定都在编译时完成 - 甚至绑定到隐式转换运算符。这意味着您使用方法重载解决方案遇到的问题也会阻止编译器确定您是否希望将null隐式强制转换为T1或T2。使用dynamic无法正常工作,因为null在运行时没有任何类型。

如果您可以分享更多信息,可能还有其他解决方案可以解决您的问题。例如,如果两个方法中的任何一个在传递空值时都能正常工作,并且您只是想让生成的代码进行编译,那么您可以创建一个这样的方法:

foo(object o) {return Foo((T1)null);}

然后将来电转换为:

foo(new object());

如果您想使用Null类而不是object,上述方法也可以使用 - 不需要隐式转换。

另一方面,如果确实重要的是使用空值调用哪个重载,那么您需要告诉我们原始程序如何确定要调用哪个。