gpt4 book ai didi

C# 可空静态分析——能否使用具有多个返回值的条件后置条件?

转载 作者:行者123 更新时间:2023-12-04 03:34:05 25 4
gpt4 key购买 nike

使用启用了可为空上下文的 C# 8+,我有一个返回值的方法

  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 返回值和 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.
}

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

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

最佳答案

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

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

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

关于C# 可空静态分析——能否使用具有多个返回值的条件后置条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67290267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com