为什么不能编译?
int? number = true ? 5 : null;
无法确定条件表达式的类型,因为'int'和<null>之间没有隐式转换
为什么不能编译?
int? number = true ? 5 : null;
无法确定条件表达式的类型,因为'int'和<null>之间没有隐式转换
当前回答
5是一个int型,null不能隐式转换为int型。
以下是解决这个问题的方法:
int? num = true ? 5 : default(int?);
int? num = true ? 5 : new int?();
int? num = true ? 5 : null as int?;
int? num = true ? 5 : (int?)null;
int? num = true ? (int?)5 : null;
int? num = true ? 5 as int? : null;
int? num = true ? new int?(5) : null;
还有,你在哪里看到int?你可以使用Nullable<int>代替。
其他回答
5是一个int型,null不能隐式转换为int型。
以下是解决这个问题的方法:
int? num = true ? 5 : default(int?);
int? num = true ? 5 : new int?();
int? num = true ? 5 : null as int?;
int? num = true ? 5 : (int?)null;
int? num = true ? (int?)5 : null;
int? num = true ? 5 as int? : null;
int? num = true ? new int?(5) : null;
还有,你在哪里看到int?你可以使用Nullable<int>代替。
规范(§7.14)说,对于条件表达式b ?X: y,有三种可能,要么X和y都有类型并且满足某些良好条件,要么X和y中只有一个有类型并且满足某些良好条件,要么发生编译时错误。在这里,“某些良好的条件”意味着某些转换是可能的,我们将在下面详细讨论。
现在,让我们转向规范的相关部分:
如果x和y中只有一个具有类型,并且x和y都可以隐式转换为该类型,那么这就是条件表达式的类型。
这里的问题是
int? number = true ? 5 : null;
只有一个条件结果具有类型。这里x是int字面值,y是null,它没有类型,而且null不能隐式转换为int1。因此,不满足“某些良好条件”,就会发生编译时错误。
有两种方法:
int? number = true ? (int?)5 : null;
这里仍然是x和y中只有一个有类型的情况。请注意,null仍然没有类型,编译器不会有任何问题,因为(int?)5和null都是隐式转换为int?(§6.1.4和§6.1.5)。
另一种方式显然是:
int? number = true ? 5 : (int?)null;
但现在我们必须阅读规范中的另一个条款来理解为什么这是可以的:
如果x有类型x y有类型y那么 如果存在从X到Y的隐式转换(§6.1),但不存在从Y到X的隐式转换,则Y是条件表达式的类型。 如果存在从Y到X的隐式转换(§6.1),但不存在从X到Y的隐式转换,则X是条件表达式的类型。 否则,无法确定表达式类型,并发生编译时错误。
这里x是int类型y是int类型?有没有从int的隐式转换?到int,但是有一个从int到int的隐式转换?所以表达式的类型是int?
1:进一步注意,在确定条件表达式的类型时,左边的类型被忽略,这是这里常见的混淆来源。
Null没有任何可识别的类型——它只需要一点刺激就可以了:
int? number = true ? 5 : (int?)null;
在c# 9中,这是允许的博客
目标输入??然后呢? 有时是有条件的?和?:表达式在分支之间没有明显的共享类型。这样的情况在今天是失败的,但是c# 9.0将允许它们,如果两个分支都转换为一个目标类型:
Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type
或者你的例子:
// Allowed in C# 9.
int? number = true ? 5 : null;