考虑这个类
public sealed record IdValuePair<TId, TValue>
{
public IdValuePair(TId id, TValue value)
{
EnsureArg.HasValue(value, nameof(value));
Id = id;
Value = value;
}
public IdValuePair(TValue value)
{
EnsureArg.HasValue(value, nameof(value));
Id = default!;
Value = value;
}
public TId Id { get; }
public TValue Value { get; }
}
为什么如果我添加通用约束
where TId : notnull
由于以下错误,我无法完成此作业:
Id = default;
CS8601 Possible null reference assignment.
notnull
约束不能确保 TId
不为 null 吗?
最佳答案
考虑IdValuePair<string, int>
,字符串的默认值为 null
。因此,将 null 分配给 Id 显然是非法的,因为您 promise 它不应该为 null。
添加约束where TId : notnull
约束只会阻止像 IdValuePair<string?, int>
这样的声明。因此,我们将从“可能的空引用分配”变为“明确空引用分配”。
据我所知,没有generic constraint将类型限制为可为空引用或可为空结构。这可能会导致某些通用代码出现问题。
有几种可能的选择:
- 使用结构约束。值类型永远不能为 null,因此分配默认值应该是完全安全的。
- 使用新约束,并创建一个新对象,而不是使用
default
- 创建您自己的
Maybe<T> / Option<T> / Nullable<T>
类型。
关于c# - 为什么我不能将默认值分配给我的 notnull 泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71423220/