【问题标题】:Convert between nullable int and int在可为空的 int 和 int 之间转换
【发布时间】:2014-01-29 06:15:55
【问题描述】:

我想做这样的事情:

int? l = lc.HasValue ? (int)lc.Value : null; 

其中 lc 是一个可为空的枚举类型,比如 EMyEnumeration?。所以我想测试 lc 是否有值,那么如果然后将它的 int 值赋给 l,否则 l 为空。但是当我这样做时,C# 抱怨“条件表达式的错误类型无法确定,因为 'int' 和 '' 之间没有隐式转换。

我怎样才能使它正确?提前致谢!!

【问题讨论】:

    标签: c# int nullable enumeration


    【解决方案1】:

    你也必须投射null

    int? l = lc.HasValue ? (int)lc.Value : (int?)null; 
    

    顺便说一句,这是conditional operatorif-else 之间的区别之一:

    if (lc.HasValue)
        l = (int)lc.Value;
    else
        l = null;  // works
    

    相关的 C# 规范是 7.14 条件运算符

    ?: operator 的第二个和第三个操作数 x 和 y 控制条件表达式的类型。

    • 如果 x 具有 X 类型并且 y 具有 Y 类型,则
      • 如果存在从 X 到 Y 而不是从 Y 到 X 的隐式转换(第 6.1 节),则 Y 是条件表达式的类型。
      • 如果存在从 Y 到 X 而不是从 X 到 Y 的隐式转换(第 6.1 节),则 X 是条件表达式的类型。
      • 否则,无法确定表达式类型,并出现编译时错误。

    由于int 不能隐式转换为null,反之亦然,您会收到编译器错误。但是您也可以将enum 转换为int? 而不是int,后者 是可转换的。然后编译器可以导出类型并编译:

    int? l = lc.HasValue ? (int?)lc.Value : null; // works also
    

    或者,正如 Sergey 在他的 answer 中提到的那样,直接:

    int? l = (int?)lc;
    

    【讨论】:

      【解决方案2】:

      只需将您的可空枚举值转换为可空整数:

      int? l = (int?)lc;
      

      由于 C# 规范 6.2.3 显式可空转换:

      基于基础转换评估可空转换 如果可以为空的转换是从 S?给T?:

      • 如果源值为 null(HasValue 属性为 false),则结果为 T? 类型的 null 值。
      • 否则,转换被评估为从 S?到 S,然后是从 S 到 T 的基础转换,然后是 从 T 换行到 T?。

      【讨论】:

      • 我自己就是这么想的。 :)
      【解决方案3】:

      你应该这样做:

      int? l = lc.HasValue ? (int)lc.Value : (int?)null; 
      

      【讨论】:

      • 不是我,但我想有人发现你是一个连续的低质量海报。如果是关于恶意连续投票:这些将被检测到并撤消。防止其他反对票是您的工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2018-01-22
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      相关资源
      最近更新 更多