当变量类型为[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? 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是条件表达式的类型。
否则,无法确定任何表达式类型,并且会发生编译时错误。
因为编译器不使用左侧变量的类型来确定右侧表达式的类型。首先,它确定表达式的类型,然后确定是否可以将其放入变量中。
在int
和null
值之间没有足够接近的类型是公共的。您必须使int
值为null或使null
值为"可维护",编译器才能为这些值找到共同点。
当您有string
和null
值时,编译器可以简单地使用其中一种类型,因为字符串已经可以为null了。