C#条件运算符?:在可空整数方面存在问题

4
为什么当我的函数返回一个可空整数“int?”时,条件运算符“?:”在这里无法工作?“return null”可以使用,但是使用“?:”之前必须先将“null”强制转换为“(int?)”。
Possible Duplicate: Nullable<value>类型是否能够使用条件运算符分配?
    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链接的更好的答案。 - CodesInChaos
1
请查看Eric Lippert的相关博客文章:类型推断困境,第一部分 - CodesInChaos
4个回答

5

试着将你的最后一行改为这样:

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

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

1

一个null值和一个int值都可以隐式转换为int?数据类型,但如果你不告诉编译器,单独使用null文字常量时它无法知道它是除了object之外的任何内容。没有一个通用的数据类型可以将objectint都隐式转换为,这就是编译器抱怨的地方。

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


0

?: 运算符的两个条件必须隐式兼容。 int 永远不可能是 null,因此会出现编译时错误(同样,null 也永远不可能是 int)。你必须进行强制转换,使用三元运算符是无法绕过这个问题的。

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


0

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

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

在您的情况下,我们有一个类型为 int 的返回值和一个 null。没有可用的转换。虽然可以转换为 int?,但这不是 ?: 考虑的两种可能返回类型之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接