C# 是否有某种 value_or_execute 或 value_or_ throw ?

Jul*_*ARD 2 c#

我正在学习 C# 并试图处理涌入的“a可能是null”警告。

我想知道,由于当某些内容为空时,通过从函数返回或抛出异常而出错是一种常见的情况,C# 是否有某种针对这种情况的语法糖?

我的想法的示例:(int a = obtainA() ??? { Console.WriteLine("Fatal error;") return };这不是真正的代码)

我了解????=运算符,但它们似乎没有多大帮助,而且我还没有找到更好的。

如果不是,我们最接近模仿的是什么?难道没有比写下面更好的方法了吗?

int? nullableA = obtainA();
int a;
if (nullableA.HasValue) {
    a = nullableA.Value;
}
else {
    Console.WriteLine("Fatal error");
    return;
}
/* use a, or skip defining a and trust the static analyzer to notice nullableA is not null */
Run Code Online (Sandbox Code Playgroud)

Gur*_*ron 6

??从 C# 7 开始,可以使用该语言版本中引入的throw 表达式通过运算符实现“or_throw” :

int? i = null;
int j = i ?? throw new Exception();
Run Code Online (Sandbox Code Playgroud)

另一种抛出方法可以通过以下方式实现ArgumentNullException.ThrowIfNull

#nullable enable
int? i = null;
ArgumentNullException.ThrowIfNull(i);
int j = i.Value; // no warning, compiler determines that i can't be null here
Run Code Online (Sandbox Code Playgroud)

您还可以编写自己的方法,支持可空流分析(就像ArgumentNullException.ThrowIfNull这样做),并使用由 C# 编译器解释的空状态静态分析的属性

#nullable enable
int? i = null;
if (IsNullAndReport(i)) return;
int j = i.Value; // no warning, compiler determines that i can't be null here

bool IsNullAndReport([NotNullWhen(false)]int? v, [CallerArgumentExpression(nameof(i))] string name = "")
{
    if (v is null)
    {
        Console.WriteLine($"{name} is null;");
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

以及模式匹配方法:

int? i = null;
if (i is { } j) // checks if i is not null and assigns value to scoped variable 
{
    // use j which is int
}
else
{
    Console.WriteLine("Fatal error");
    return;
}
Run Code Online (Sandbox Code Playgroud)