为什么我不能为我的 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 将类型限制为可空引用或可空结构。这可能会导致某些通用代码出现问题。

有几个可能的选项:

  1. 使用 struct-constraint。值类型永远不能为 null,因此分配默认值应该是绝对安全的。
  2. 使用 new-constraint,并创建一个新对象而不是使用 default
  3. 创建您自己的 Maybe<T> / Option<T> / Nullable<T> 类型。