【问题标题】:C# Nullable List [closed]C# 可空列表 [关闭]
【发布时间】:2023-01-08 08:21:33
【问题描述】:

以下所有内容都有效吗?它们是实例化为 _s 的类的属性。

    public List<int>? _Int1 { get; set; }
    public List<int?> _Int2 { get; set; }
    public List<Nullable<int>> _Int3 { get; set; }

我已经尝试了所有这些并且一切正常。但是,当我分配值时,它必须与定义的方式完全匹配,即:

        _s._Int1 = new List<int> { 0 } ;
        _s._Int2 = new List<int?> { 0 };
        _s._Int3 = new List<Nullable<int>> { 0 };

如果我要分配不同的内容,那么我会得到以下信息:

        _s._Int1 = new List<int?> { 0 } ;                   // fail
        _s._Int2 = new List<Nullable<int>> { 0 };           // OK
        _s._Int3 = new List<int?> { 0 };                    // OK

我的问题是声明 Nullable 的正确方法是什么。谢谢。

【问题讨论】:

  • _int2 和 _Int3 相同,描述的是一个列表,其项可以为空或整数。 _Int1 是一个变量,可以为 null 或引用整数列表。
  • #2 和#3 是相同的...?只是 Nullable<T> 的简写。 #1 告诉您集合本身可以为空。
  • #1 似乎是语法错误,那里不需要 ?,它不是可为空的 int
  • public List&lt;int&gt; _Int1 = null; => 你可以给列表赋空值
  • 对于_Int1,列表可以为空,但该列表中的任何项目都不能为空,对于_Int2,列表不能为空,但列表中的项目可以为空。

标签: c# nullable


【解决方案1】:

请注意,T? 可能意味着两个不同的东西:

  1. 如果Tstruct,那么T?Nullable&lt;T&gt;
  2. 如果Tclass那么T?意味着可空引用类型,这意味着实例是不应该为空

    请参阅https://learn.microsoft.com/en-us/dotnet/csharp/nullable-references了解详情

    在你的问题中int?是一个情况1,因为intstruct,当List&lt;int?&gt;案例#2,因为List&lt;T&gt;class

    // _Int1 is List<int>
    // _Int1 can be null
    public List<int>? _Int1 { get; set; } 
    
    // _Int2 is List<Nullable<int>>
    // _Int2 is not supposed to be null
    public List<int?> _Int2 { get; set; }
    
    // Longer version of _Int2 type declaration
    // _Int3 is List<Nullable<int>>
    // _Int3 is not supposed to be null
    public List<Nullable<int>> _Int3 { get; set; }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多