我使用 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/