[英]How to use Conditional Operation with Nullable Int
一个小问题。 任何想法的人为什么这不起作用?
int? nullableIntVal = (this.Policy == null) ? null : 1;
如果左手表达式为True,我试图返回null
,否则返回1
。 看似简单,但给出了编译错误。
无法确定条件表达式的类型,因为null
和int
之间没有隐式转换。
如果我替换null
? null : 1
? null : 1
有任何有效的int
,那么没有问题。
是 - 编译器无法为条件表达式找到合适的类型。 忽略你将它分配给int?
的事实int?
- 编译器不使用该信息。 所以表达式是:
(this.Policy == null) ? null : 1;
这个表达的类型是什么? 语言规范声明它必须是第二个操作数的类型或第三个操作数的类型。 null
没有类型,所以它必须是int
(第三个操作数的类型) - 但是没有从null
到int
转换,所以它失败了。
将任一个操作数转换为int?
它会工作,或使用另一种方式来消除空值 - 所以这些中的任何一个:
(this.Policy == null) ? (int?) null : 1;
(this.Policy == null) ? null : (int?) 1;
(this.Policy == null) ? default(int?) : 1;
(this.Policy == null) ? new int?() : 1;
我同意你必须这样做有点痛苦。
从C#3.0语言规范第7.13节:
?:运算符的第二个和第三个操作数控制条件表达式的类型。 设X和Y是第二个和第三个操作数的类型。 然后,
如果X和Y是相同的类型,那么这是条件表达式的类型。
否则,如果从X到Y存在隐式转换(第6.1节),而不是从Y到X,则Y是条件表达式的类型。
否则,如果从Y到X存在隐式转换(第6.1节),而不是从X到Y,则X是条件表达式的类型。
否则,无法确定表达式类型,并发生编译时错误。
试试这个:
int? nullableIntVal = (this.Policy == null) ? (int?) null : 1;
也许你可以试试:
default( int? );
而不是null
这有效: int? nullableIntVal = (this.Policy == null) ? null : (int?)1;
int? nullableIntVal = (this.Policy == null) ? null : (int?)1;
。
原因(从评论中复制):
错误消息是因为?:
运算符的两个分支( null
和1
)没有兼容的类型。 新解决方案的分支(使用null
和(int?)1
)可以。
诠释? i =(true?new int?():1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.