c# - C# 中的可空变量是否可以从某个时间点为编译器标记为非空?

标签 c# nullable optional-parameters

我使用 null 来表示可选参数 A?一个函数的一个 应该假定一个非空的默认值,在函数中计算。进入函数后,我检查传入的参数a是否为null,如果是,则给a赋值一个非空值。从那时起,可以安全地假设 a 是非空的。问题:编译器没有意识到这一点,现在我必须引用 a.Value 来获取函数的其余部分,而不是直接的 a

有没有办法告诉编译器 a 从某个时候开始实际上是非空的?如果不是,那么处理这些可选参数最清晰的方法是什么?

示例代码:

using System;

namespace test
{

    public struct A { public int x; };

    class Program
    {

        static void f(A? a = null)
        {
            // Assign the default value.
            if (a == null) a = new A { x = 3 };
            // Now 'a' is non-null for the rest of the function.
            // What I do now:
            Console.WriteLine(a.Value.x);
            // What I'd like to do:
            // * Mark 'a' as non-null somehow.
            // Now can refer to 'a' directly:
            // Console.WriteLine(a.x);
        }

        static void Main(string[] args)
        {
            f();
        }
    }
}

最佳答案

不,没有 - 不适用于可为空的 value 类型。可空值类型的编译时类型仍然是 Nullable<T> ,即使编译器知道它将是非空的。

这与可为空的 reference 类型不同,编译器会跟踪它是否认为变量可能为空,以警告取消引用。对于可空引用类型,没有“真正的”单独的可空和不可空类型——只有单个引用类型指示值是否可能为空。

在问题的评论中给出的引入新的不可为空变量的方法实际上是唯一的前进方式。

关于c# - C# 中的可空变量是否可以从某个时间点为编译器标记为非空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70153537/

相关文章:

c# - 无法理解带有可选参数的方法的输出

c# - 在 ASP.NET Core 中有条件隐藏操作方法的简单便捷方法

c# - 碰撞检测有问题

c# - 将 Nullable<DateTime> 序列化为 XML

c# - 为什么可空的模式匹配会导致语法错误?

java - Guava Optional 作为可选参数的方法参数

c# - 应该覆盖哪些方法才能正确继承 `ObservableCollection`

c# - WP7 C# - 如何更改 Pivot 标题的样式

c# - 具有可空 double 的 Web 服务响应未正确反序列化

javascript - JavaScript 中可以有多个可选参数吗?