c# - 为什么我不能将默认值分配给我的 notnull 泛型类型?

标签 c# generics default .net-6.0 notnull

考虑这个类

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

有几种可能的选择:

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

关于c# - 为什么我不能将默认值分配给我的 notnull 泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71423220/

相关文章:

c# - Int32.Parse()如何准确解析String?

java - 检查项目是否是泛型类的实例

java - 在 Java 列表中存储不同类型的元素

android - Android 中的 Activity 和 list

c# - ASP.NET MVC 中的一个 Web.config 而不是每个 Views 文件夹的多个

c# - 添加 XML 元素

c# - 在应用程序状态中存储通用列表

java - java 类中变量的私有(private)作用域与默认作用域 - 任何性能问题

sql - SQL Server 将空值插入非空列时如何设置默认值?

C#:从文本框转换(识别)数学公式