繁体   English   中英

如何使用Nullable Int的条件运算

[英]How to use Conditional Operation with Nullable Int

一个小问题。 任何想法的人为什么这不起作用?

int? nullableIntVal = (this.Policy == null) ? null : 1;

如果左手表达式为True,我试图返回null ,否则返回1 看似简单,但给出了编译错误。

无法确定条件表达式的类型,因为nullint之间没有隐式转换。

如果我替换null ? null : 1 ? null : 1有任何有效的int ,那么没有问题。

是 - 编译器无法为条件表达式找到合适的类型。 忽略你将它分配给int?的事实int? - 编译器不使用该信息。 所以表达式是:

(this.Policy == null) ? null : 1;

这个表达的类型是什么? 语言规范声明它必须是第二个操作数的类型或第三个操作数的类型。 null没有类型,所以它必须是int (第三个操作数的类型) - 但是没有从nullint转换,所以它失败了。

将任一个操作数转换为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;

原因(从评论中复制):

错误消息是因为?:运算符的两个分支( null1 )没有兼容的类型。 新解决方案的分支(使用null(int?)1 )可以。

诠释? i =(true?new int?():1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM