C#条件运算符?:有可空int的问题

时间:2012-04-21 17:24:18

标签: c#

  

可能重复:
  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;
    }

4 个答案:

答案 0 :(得分:5)

尝试将最后一行更改为:

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

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

答案 1 :(得分:1)

null值和int值都可以隐式转换为int?数据类型,但其自身的文字null未知如果你不告诉它,编译器应该是object以外的任何东西。没有可以隐式转换objectint的通用数据类型,这正是编译器所抱怨的。

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

答案 2 :(得分:0)

?:运算符的两个条件必须是隐式兼容的。 int永远不会是null,因此存在编译时错误(同样,null永远不会是int)。你必须施展,使用三元无法绕过它。

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

答案 3 :(得分:0)

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

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

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