【问题标题】:C# conditional operator ?: has problems with nullable int [duplicate]C# 条件运算符?:可空 int 存在问题 [重复]
【发布时间】:2012-05-02 22:17:03
【问题描述】:

可能重复:
Conditional operator assignment with Nullable<value> types?

为什么当我的函数返回一个可为空的整数“int?”时,条件运算符“?:”在这里不起作用? “return null” 有效,但对于“?:”,我必须先将“null”转换为“(int?)”。

    public int? IsLongName(string name) {

        int length = name.Length;

        // this works without problems
        if (name.Length > 10) {
            return null;
        } else {
            return name.Length;
        }

        // this reports: 
        // Type of conditional expression cannot be determined because 
        // there is no implicit conversion between '<null>' and 'int'
        return name.Length > 10 ? null : name.Length;
    }

【问题讨论】:

  • 我们没有更好的副本吗?还是在 eric 的博客上?我当然记得这个问题的答案比 jon 链接的答案更好。
  • 查看 Eric Lippert 的相关博文:Type inference woes, part one

标签: c#


【解决方案1】:

尝试将最后一行更改为:

return name.Length > 10 ? null : (int?)name.Length;

编译器无法理解 ?: 运算符的返回类型是什么。它有冲突的值 - null 和 int。通过将 int 强制转换为 nullable,编译器可以理解返回类型为 nullable int,并且 null 也会被接受。

【讨论】:

    【解决方案2】:

    null 值和 int 值都可以隐式转换为 int? 数据类型,但编译器不知道 null 本身的文字除了是object 如果你不告诉它。 objectint 都没有可以隐式转换为的通用数据类型,这就是编译器所抱怨的。

    正如 Yorye 所说,您可以将 int 转换为 int? 以让编译器进行转换;或者,您可以将null 强制转换为int?,然后允许编译器使用从intint? 的隐式转换。

    【讨论】:

      【解决方案3】:

      ?: 运算符的两个条件必须隐式兼容。 int 永远不可能是 null,因此会出现编译时错误(同样,null 永远不可能是 int)。你必须投射,没有办法使用三元来解决它。

      我认为 if 语句不会有同样的问题,因为编译器只会检查该方法是否从任何给定路径返回到返回类型的兼容值,而不是来自任何给定出口的返回值点隐式兼容另一个块的返回值。

      【讨论】:

        【解决方案4】:

        ?: 运算符考虑其两个可能返回值的类型。它不知道将接收其结果的变量的类型(实际上,在更复杂的表达式中,可能不存在显式变量)。

        如果其中一个返回值是null,它没有类型信息——它只能检查other返回值的类型,并检查是否存在转换。

        在您的情况下,我们有nullint 类型的返回值。没有可用的转换。 转换为int?,但这不是?: 正在考虑的两种可能的返回类型。

        【讨论】:

          猜你喜欢
          • 2013-06-20
          • 2010-09-22
          • 1970-01-01
          • 2021-04-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-21
          相关资源
          最近更新 更多