C# 可空静态分析——可以使用条件 post 条件和多个 return 值吗?

C# Nullable Static Analysis—Can you use conditional post-conditions with multiple return values?

在启用可为空上下文的情况下使用 C# 8+,我有一个方法 returns

  1. 表示各种错误代码或成功的枚举;
  2. 对象(如果成功)或 null(如果错误)

作为 ValueTuple。除了 null-forgiving operator,如果枚举值指示成功,有没有办法告诉编译器该对象不为空?

private (EnumResult, SomeClass?) DoThing(...)
{
    if (...)
        return (EnumResult.Error1, null);

    if (...)
        return (EnumResult.Error2, null);

    return (EnumResult.Success, new SomeClass(...));
}
(EnumResult result, SomeClass? someClass) = DoThing(...);

if (result == EnumResult.Success)
{
    // `someClass` should not be null here, but the compiler doesn't know that.
}

我知道有 nullable static analysis attributes 可以在使用 bool return 和 out 参数时应用:

private bool TryDoThing(..., [NotNullWhen(true)] out SomeClass? someClass)
{
    if (...)
    {
        someClass = null;
        return false;
    }

    someClass = new SomeClass(...);
    return true;
}
if (TryDoThing(..., out SomeClass someClass))
{
    // The compiler knows that `someClass` is not null here.
}

但我无法确定如何在 returning ValueTuple 时应用类似的东西。

我使用的是枚举而不是布尔值或抛出异常,因为结果代码是通过 named pipe 传递的,另一端的进程将其解析回枚举,然后根据具体错误。出于个人喜好,我使用的是 ValueTuple 而不是 out 参数。

没有。此时,MaybeNullWhen/NotNullWhen 属性仅用于表示 out 参数的空状态取决于 bool return 值。

例如,目前没有计划允许变量的空状态取决于枚举 return 值的值。

也没有计划允许元组 return 值的元素之间相互依赖,即 (object? result, bool ok) Method() 模式。如果您对将此类功能添加到语言中感兴趣,请随时在 https://github.com/dotnet/csharplang/discussions.

开始讨论它的工作原理