为什么我不能为我的 notnull 泛型类型分配默认值?
Why can't I assign default to my notnull generic type?
考虑这个 class
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
不为空吗?
考虑 IdValuePair<string, int>
,字符串的默认值为 null
。因此,将 null 分配给 Id 显然是非法的,因为您承诺它不应该为 null。
添加约束 where TId : notnull
约束只会阻止像 IdValuePair<string?, int>
这样的声明。因此,我们将从“可能 空引用赋值”变为“确定 空引用赋值”。
据我所知,没有 generic constraint 将类型限制为可空引用或可空结构。这可能会导致某些通用代码出现问题。
有几个可能的选项:
- 使用 struct-constraint。值类型永远不能为 null,因此分配默认值应该是绝对安全的。
- 使用 new-constraint,并创建一个新对象而不是使用
default
- 创建您自己的
Maybe<T> / Option<T> / Nullable<T>
类型。
考虑这个 class
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
不为空吗?
考虑 IdValuePair<string, int>
,字符串的默认值为 null
。因此,将 null 分配给 Id 显然是非法的,因为您承诺它不应该为 null。
添加约束 where TId : notnull
约束只会阻止像 IdValuePair<string?, int>
这样的声明。因此,我们将从“可能 空引用赋值”变为“确定 空引用赋值”。
据我所知,没有 generic constraint 将类型限制为可空引用或可空结构。这可能会导致某些通用代码出现问题。
有几个可能的选项:
- 使用 struct-constraint。值类型永远不能为 null,因此分配默认值应该是绝对安全的。
- 使用 new-constraint,并创建一个新对象而不是使用
default
- 创建您自己的
Maybe<T> / Option<T> / Nullable<T>
类型。