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

本文关键字:整数 问题 条件运算符 存在 | 更新日期: 2023-09-27 18:31:56

可能的重复项:
具有 Nullable 类型的条件运算符赋值?

为什么当我的函数返回可为空的整数"int?"时,条件运算符"?:"在这里不起作用?返回 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;
    }

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

尝试将最后一行更改为:

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

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

null

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

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

?:运算符的两个条件都必须隐式兼容。 int永远不能null,所以存在编译时错误(同样,null永远不能int)。 你必须投射,使用三元是没有办法的。

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

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

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

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