gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:45:32 24 4
gpt4 key购买 nike

为了自动将代码从 C++ 转换为 C#,我想要一个 C# 类(伪代码)

class Null {
public static implicit operator T (Null unused) {
return null;
}
}

这在以下情况下很有用

foo(T1 x) { ... }
foo(T2 x) { ... }

foo(null); // ambiguous

由于某些原因,通常不可能以编程方式消除上述类型的歧义。例如

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 编译。

是否可以编写这样的类?

最佳答案

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

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

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

然后将调用转换为:

foo(new object());

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

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

关于C# 泛型隐式运算符返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25065935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com