gpt4 book ai didi

C# 可空性未正确推断

转载 作者:行者123 更新时间:2023-12-04 08:55:44 31 4
gpt4 key购买 nike

考虑:

#nullable enable

class Manager {
public int Age;
}

class Archive {
readonly Dictionary<string, Manager> Dict = new Dictionary<string, Manager>();

public (bool ok, Manager? value) this[string key] {
get {
return Dict.TryGetValue(key, out var value) ? (true, value) : (false, null);
}
}
}
然后我尝试:
Archive archive = new Archive();
var (ok, john) = archive["John"];
if (!ok) return;
int age = john.Age; // <-- warning
我收到警告:

Warning CS8602 Dereference of a possibly null reference.


为什么 ?我希望在检查 !ok 后编译器会推导出 john不为空
我尝试的另一件事是:
public (bool ok, Manager value) this[string key] {
get {
return Dict.TryGetValue(key, out var value) ? (true, value) : default;
}
}
(从 Manager 结果中删除 ? 并将 (false, null) 替换为 default )

我现在没有收到任何警告,但如果我取消对 !ok 的检查,我也不会收到任何警告。 .
有什么办法可以在这里实现我想要的 - 警告 当且仅当 之前没有检查 !ok (那是我忘了检查它)
谢谢

最佳答案

Why ? I expected that after checking for !ok the compiler will deduce that john is not null


这不起作用有两个原因:
  • 可空性分析一次只查看一种方法。

  • 分析时:
    Archive archive = new Archive();
    var (ok, john) = archive["John"];
    if (!ok) return;
    int age = john.Age; // <-- warning
    编译器看不到这个方法:
      public (bool ok, Manager? value) this[string key] {
    get {
    return Dict.TryGetValue(key, out var value) ? (true, value) : (false, null);
    }
    }
    并告诉 valueok 时不为空是真的。
  • 可空性分析不跟踪 bool 变量。

  • 目前,编译器不够聪明,无法跟踪 bool 变量的来源,并根据它们更新可空性。例如,以下不会发出警告:
    M(string? str)
    {
    if (string != null)
    Console.WriteLine(str.Length);
    }
    但以下等效代码确实如此:
    M(string? str)
    {
    var isNotNull = string != null;
    if (isNotNull)
    Console.WriteLine(str.Length);
    }

    Is there any way to achieve what I want here - a warning if and only if there was no previous check for !ok (that is I forgot to check for it)


    恐怕不是元组。最好的方法是使用 out 参数,尽管这意味着您不能使用索引器:
    public bool TryGetManager(string key, [NotNullWhen(true)] Manager? manager) 
    => Dict.TryGetValue(key, out manager);

    关于C# 可空性未正确推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63845429/

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