8

一个小问题。知道为什么这不起作用吗?

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

null如果左手表达式为 True,我试图返回,否则1。看起来很简单,但会产生编译错误。

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

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

4

5 回答 5

21

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

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

这个表达式的类型是什么?语言规范声明它必须是第二个操作数的类型或第三个操作数的类型。null没有类型,所以它必须是int(第三个操作数的类型) - 但是没有从nullto的转换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 是条件表达式的类型。

  • 否则,无法确定表达式类型,并出现编译时错误。

于 2010-05-21T10:50:04.860 回答
4

尝试这个:

int? nullableIntVal = (this.Policy == null) ? (int?) null : 1; 
于 2010-05-21T10:47:52.977 回答
2

也许你可以试试:

default( int? );

而不是空

于 2010-05-21T10:48:47.197 回答
1

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

原因(从评论中复制):

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

于 2010-05-21T10:47:44.037 回答
1

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

于 2010-05-21T10:51:37.443 回答