4

可能重复:
具有 Nullable<value> 类型的条件运算符分配?

为什么当我的函数返回一个可为空的整数“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

4 回答 4

5

尝试将最后一行更改为:

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

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

于 2012-04-21T17:25:42.227 回答
1

null值和值都int可以隐式转换为数据类型,但是如果您不告诉它,编译器不知道其本身int?的文字是 an 以外的任何东西。没有通用的数据类型可以同时隐式转换为编译器所抱怨的。nullobjectobjectint

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

于 2012-04-21T17:30:03.080 回答
0

运算符的两个条件?:必须隐式兼容。intcan never be null,因此存在编译时错误(同样,nullcan never be int)。你必须施放,没有办法使用三元来解决它。

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

于 2012-04-21T17:34:17.413 回答
0

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

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

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

于 2012-04-21T17:36:08.873 回答