【发布时间】:2020-09-12 06:48:29
【问题描述】:
考虑以下(VS 16.8.0 Preview 2.1 C# 9.0 preview)代码:
#nullable enable
using System.Collections.Generic;
class Archive<T> where T : notnull
{
readonly Dictionary<string, T> Dict = new();
public T? GetAt(string key)
{
return Dict.TryGetValue(key, out var value) ? value : default;
}
}
class Manager
{
public int Age { get; set; }
}
class Main34
{
long F3()
{
Archive<long> a = new();
var johnAge = a.GetAt("john");
if (johnAge is null) return -1; // Error CS0037 Cannot convert null to 'long' because it is a non - nullable value type
return johnAge;
}
long F4()
{
Archive<Manager> a = new();
var johnAge = a.GetAt("john");
//if (johnAge is null) return -1;
return johnAge.Age; // Correct ! warning "Derefrencing of a possibly null reference" will be removed if line above unremarked
}
}
我很难理解/解决 F3 中的错误,
似乎编译器认为 johnAge 存在 long 而不是 long?(正如我在 VS 中将鼠标悬停在它上面验证的那样),尽管返回的 Archive<T>.GetAt 是 T?
有没有办法拥有一个通用的存档来做我想要的(一个 GetAt 方法,即使 T 是一个不可为空的基本类型,即 long 也返回 Nullable)?
【问题讨论】:
-
我在你的另一个问题中发布了这个,我通读了它,它帮助我理解了一点:stackoverflow.com/questions/58229782/…所有答案都是相关的。
-
可能是因为在
value : default中,default代表的是0(default(T)),而不是null(default(T?))。 -
如果您在每个帖子中坚持 一个 问题(最好格式化它,这样我们就不需要横向滚动),这会有所帮助。您实际上希望在这篇文章中回答哪个示例?请编辑问题,使其仅解决该问题。您可以随时针对其他问题发布另一个问题。
-
@SandeepPandey -- 这就是我们在业内喜欢称之为kludge的东西。
-
好的,它正在在 VS 中为我编译,而不是从命令行编译。预览的乐趣。我相信我现在可以添加答案。