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)
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 : null中x,子表达式仍必须"本质上"获取其类型.这种类型x不能"泄漏"到子表达式上.对于许多新的C#开发人员来说,这种"语法"似乎是一个惊喜.经常会看到像你这样的问题,例如参见条件运算符的Nullable类型问题?:以及链接到它的线程.
| 归档时间: |
|
| 查看次数: |
1799 次 |
| 最近记录: |