【问题标题】:Is it possible to assign a value to a nullable using the conditional operator?是否可以使用条件运算符将值分配给可空值?
【发布时间】:2011-10-05 09:51:46
【问题描述】:

我知道我可以做到:

Int32 tempInt;
Int32? exitNum;

if (Int32.TryParse(fields[13], out tempInt))
    exitNum = tempInt;
else
    exitNum = null;

但是为什么我不能这样做呢?

Int32 tempInt;
Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : null;

有没有办法使用条件运算符将值分配给可为空的?

【问题讨论】:

标签: c# nullable conditional-operator


【解决方案1】:

条件运算符的一侧必须可转换为另一侧的类型。
在您的情况下,一侧有一个 int,另一侧有一个 null (无类型表达式)。由于任何一方都不能直接与另一方兼容,所以它不起作用。

您需要确保至少一侧是int?,通过强制转换或写new int?()

Int32.TryParse(fields[13], out tempInt) ? tempInt : new int?()

【讨论】:

  • 另一种选择是使用default(int?) 而不是new int?()
  • new int?() 似乎错了;这是风格问题,但我更喜欢default(int?)(int?)null
【解决方案2】:

您只需要对 Int32 进行强制转换吗?在 tempInt 上

Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? (int?)tempInt : null;

【讨论】:

    【解决方案3】:

    您可以将 null 转换为 int 吗?使双方具有相同的类型:

    Int32 tempInt;
    Int32? exitNum = Int32.TryParse(fields[13], out tempInt) ? tempInt : (int?)null;
    

    【讨论】:

      【解决方案4】:

      正如其他人所指出的,您必须确保条件运算符中存在一致的返回类型present。 (C# 的一个微妙特性是,当我们必须在多个备选方案中为一个表达式生成一个类型时,选择的备选方案始终是表达式中的 somewhere;我们从不“魔术”一个没有出现。)

      如果您对条件运算符感兴趣,我推荐我的文章:

      http://blogs.msdn.com/b/ericlippert/archive/tags/conditional+operator/

      我要补充一点,这是编写扩展方法的绝佳机会:

      static class MyExtensions
      {
          public static int? ParseInt(this string s)
          {
              int value;
              return Int32.TryParse(s, out value) ? value : (int?)null;
          }
      }
      

      现在你可以说

      int? exitNum = fields[13].ParseInt();
      

      阅读起来更愉快。

      【讨论】:

        猜你喜欢
        • 2022-11-25
        • 1970-01-01
        • 2022-09-23
        • 2011-06-30
        • 2018-02-21
        • 2019-10-08
        • 2023-04-07
        • 2021-09-12
        • 2017-03-26
        相关资源
        最近更新 更多