c# - 可空启用与 T 的集合

标签 c# nullable-reference-types

我目前正在为我们公司的一个项目启用可空选项,但我不确定如何处理以下情况。

public class MyCollection<T>
{
    private T[] myArray;
    public T this[int i]
    {
        get => myArray[i];
        set => myArray[i] = value;
    }
}

如果 T 是引用类型,我希望 null 是一个有效值。但是在值类型的情况下,我不想要 Nullable<T>要参与其中,请保持类型不变。

我尝试使用注释,但最后如果value在 setter 中可以为 null,我不得不声明 myArray作为T?[] .

public class MyCollection<T>
{
    private T[];
    [AllowNull]
    public T this[int i]
    {
        [return: MaybeNull]
        get => myArray[i];
        set => myArray[i] = value; // Possibly null
    }
}

所以我想我的问题是:

  • 如果我做myArray一个T?[] , 编译器会强制使用 Nullable<T>对于值类型?
  • 如果是这样,有没有办法做我想做的事?

最佳答案

在 C# 9 中,您可以申请 ?到“不受约束的通用类型”,它不会产生 Nullable<T>如果Tstruct .

所以你的例子变成了:

public class MyCollection<T>
{
    private T?[] myArray;
    public T? this[int i]
    {
        get => myArray[i];
        set => myArray[i] = value;
    }
}

属性也可以,但不太优雅。

关于c# - 可空启用与 T 的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67825471/

相关文章:

c# - 无法从 WebException 获取 ResponseStream

c# - 如何识别泛型类型的可为空的引用类型?

c# - 未从FirstOrDefault公开的可为空的引用类型信息

c# - ReflectionOnlyLoad 和 GetField

c# - 需要将基于 C++ dll/h/lib/xml/exe 的 SDK 'wrap up' 转换为 COM 以在 C# 2.0 项目中使用

c# - httpClient.GetAsync 抛出异常;怀疑证书配置

c# - 单击行标题内的切换按钮时如何更改数据网格行背景?

c# - 使用泛型类型的可空属性的泛型类

c# - 可空数组表示法

c# - 如何将可为空的对象引用分配给不可为空的变量?