【问题标题】:Why must I cast to (int?) in C# when variable type is [int?]当变量类型为 [int?] 时,为什么必须在 C# 中强制转换为 (int?)
【发布时间】:2013-02-07 08:03:26
【问题描述】:

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

什么时候左参数类型可以同时具有它们的两种类型?

很想做

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

我必须这样做

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

虽然int? k = null 完全有效。

相反的例子:

我不必这样做:

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

【问题讨论】:

标签: c# .net


【解决方案1】:
int? k = (DateTime.Now.Ticks%5 > 3 ? 1 : (int?) null);

在这种情况下,我们拥有的是 1 是 intnull 实际上是 null 现在的困惑是三元运算符被混淆为返回类型intnull,并且由于它的int它不会接受null

因此,您需要将其转换为可为空的 int

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

更多解释可以在Type inference - Eric找到

?的第二个和第三个操作数:操作符控制类型 条件表达式。设 X 和 Y 是第二个和 第三个操作数。那么,

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

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

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

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

【讨论】:

    【解决方案2】:

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

    intnull 值之间没有足够接近的类型。您必须使 int 值可以为空或 null 值“不可变”,以便编译器找到这些值的共同点。

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

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2020-06-04
      相关资源
      最近更新 更多