条件运算符和if-else之间的差异:

Akr*_*rem 2 c# conditional-operator

我读了这个问题,我找到了Tim Schmelter的答案:

顺便说一下,这是条件运算符和if-else之间的差异之一

你可以查看这个问题的答案,我找不到原因吗?

如果条件运算符像if-else那样工作,为什么否则不需要强制转换

题 :

int? l = lc.HasValue ? (int)lc.Value : null; 
Run Code Online (Sandbox Code Playgroud)

"Tim Schmelter"回答:

你也必须施展null:

int? l = lc.HasValue ? (int)lc.Value : (int?)null; 
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这是条件运算符和a 之间的差异之一if-else:

if (lc.HasValue)
    l = (int)lc.Value;
else
    l = null;  // works
Run Code Online (Sandbox Code Playgroud)

Jep*_*sen 5

null单独的文字没有类型,但它可以隐式转换为任何引用类型和任何Nullable<>类型.在表达式中:

x = null
Run Code Online (Sandbox Code Playgroud)

其中x被分配为空,编译器可以容易地从变量(或字段或属性或参数或其他)的类型推断出x哪些null文字应被转换成.例如,如果x是类型string,null则应表示null引用,而如果x是类型int?,null则应表示Nullable<int>where HasValue为false 的实例.

如果x是类型int,则不存在隐式转换,并且上述表达式不应编译.

(声明var x = null;var不合法的,因为null本身没有任何类型).

另一方面,在表达式中:

someBoolean ? 42 : null /* illegal */
Run Code Online (Sandbox Code Playgroud)

编译器无法确定要转换null为的类型.请记住,int既不是引用类型,也不是Nullable<>类型.

如果你的意思是包装成可空的,请使用:

someBoolean ? (int?)42 : null
Run Code Online (Sandbox Code Playgroud)

要么:

someBoolean ? 42 : (int?)null
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,编译器都会自动看到另一个操作数(在冒号的另一侧:)也必须隐式转换为int?.

如果你的意思是拳击到一些基类或接口int,写的:

someBoolean ? (object)42 : null
Run Code Online (Sandbox Code Playgroud)

要么:

someBoolean ? 42 : (object)null
Run Code Online (Sandbox Code Playgroud)

现在,上面的表达式可能是包含更大表达式的子表达式,但编译器仍然需要?:表达式的类型自己清楚.例如:

int? x;
x = someBoolean ? 42 : null; // still illegal!
Run Code Online (Sandbox Code Playgroud)

即使子表达式someBoolean ? 42 : null出现在具有类型的较大表达式x = someBoolean ? 42 : nullx,子表达式仍必须"本质上"获取其类型.这种类型x不能"泄漏"到子表达式上.对于许多新的C#开发人员来说,这种"语法"似乎是一个惊喜.经常会看到像你这样的问题,例如参见条件运算符的Nullable类型问题?:以及链接到它的线程.