当变量类型为[int?]时,为什么我必须在C#中强制转换为(int?)

本文关键字:int 转换 为什么 类型 变量 | 更新日期: 2023-09-27 17:58:19

有人能解释一下我为什么必须将null转换为int?逻辑原因吗

左参数类型何时可以同时具有这两种类型?

完成

  int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : null);

我必须做

  int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : (int?) null);

尽管CCD_ 3是完全有效的。

相反的例子:

我不必在中做这件事

string k = (DateTime.Now.Ticks%5 > 3 ? "lala" : null);

当变量类型为[int?]时,为什么我必须在C#中强制转换为(int?)

int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : (int?) null);

在这种情况下,我们得到的是1是int,而null实际上是null现在的困惑是,三元运算符被混淆为返回类型int或阱null是什么,并且由于其int,它不会接受null

因此,您需要将其强制转换为可为null的int

现在,在另一种情况下,您有一个字符串,对于string 来说,null是完全可以接受的

可以在类型推断-Eric 中找到进一步的解释

?的第二个和第三个操作数:操作员控制条件表达式。设X和Y是第二个和第三个操作数。然后,

  • 如果X和Y是同一类型,那么这就是条件表达式的类型。

  • 否则,如果存在从X到Y的隐式转换,但不存在从Y到X的隐式转化,则Y是条件表达式的类型。

  • 否则,如果存在从Y到X的隐式转换,但不存在从X到Y的隐式转化,则X是条件表达式的类型。

  • 否则,无法确定任何表达式类型,并且会发生编译时错误。

因为编译器不使用左侧变量的类型来确定右侧表达式的类型。首先,它确定表达式的类型,然后确定是否可以将其放入变量中。

intnull值之间没有足够接近的类型是公共的。您必须使int值为null或使null值为"可维护",编译器才能为这些值找到共同点。

当您有stringnull值时,编译器可以简单地使用其中一种类型,因为字符串已经可以为null了。