以下代码将无法编译:
string foo = "bar";
Object o = foo == null ? DBNull.Value : foo;
我得到:错误 1 条件表达式的类型无法确定,因为 'System.DBNull' 和 'string' 之间没有隐式转换
要解决此问题,我必须执行以下操作:
string foo = "bar";
Object o = foo == null ? DBNull.Value : (Object)foo;
这个演员表似乎毫无意义,因为这当然是合法的:
string foo = "bar";
Object o = foo == null ? "gork" : foo;
在我看来,当三元分支是不同类型时,编译器不会将值自动装箱到类型对象......但是当它们是相同类型时,自动装箱是自动的。
在我看来,第一个声明应该是合法的......
谁能描述为什么编译器不允许这样做以及为什么 C# 的设计者选择这样做?我相信这在 Java 中是合法的......虽然我还没有验证这一点。
谢谢。
编辑:我要求了解为什么 Java 和 C# 以不同的方式处理这个问题,C# 中的幕后发生了什么使这无效。我知道如何使用三元,并且不是在寻找一种“更好的方式”来编写示例。我了解 C# 中三进制的规则,但我想知道为什么...
编辑(乔恩斯基特):删除“自动装箱”标签,因为此问题不涉及装箱。