【问题标题】:How to convert IList<T?> to IList<T> in C# 8 nullable reference type如何在 C# 8 可空引用类型中将 IList<T?> 转换为 IList<T>
【发布时间】:2020-01-27 01:17:51
【问题描述】:

问题描述

我正在使用 C# 8 和 Nullable 引用类型。

我使用这样的方法收到警告:

private IList<Person?> persons;

// some initialisations here....

IList<Person> GetPersons()
{
   return someList.Where(t => t != null).ToList();
}

警告:

[CS8619] Nullability of reference types in value of type 
'IList<Person?>' doesn't match target type 'IList<Person>'.

我还尝试了以下方法:

return someList.Where(t => t != null).Select(t => t!).ToList();

但是我得到了同样的警告!!

解决方案(不满意)

我发现的唯一解决方法是:

IList<Person> GetPersons()
{
   return someList.Where(t => t != null).Select(t => Some(t)).ToList();
}

// THIS REMOVES THE WARNING
private Person Some(Person? person) => person!;

但是,如果我想让它成为通用的,它就不起作用....我再次收到警告,此方法返回 Person?

private T Some<T>(T? t) where T: class => t!;

【问题讨论】:

    标签: c#-8.0 nullable-reference-types


    【解决方案1】:

    在表达式上使用 null-forgiving 运算符,它适用于整个表达式和任何嵌套类型(即列表的泛型参数)。或者只是转换为不可为空的版本。

    IList<Person> GetPersons() => someList.Where(t => t != null).ToList()!;
    
    // or
    
    IList<Person> GetPersons() => (IList<Person>)someList.Where(t => t != null).ToList();
    

    查看提案文档:

    https://github.com/dotnet/csharplang/blob/master/proposals/csharp-8.0/nullable-reference-types.md#checking-of-nullable-references

    基本上,从IList&lt;Person?&gt;IList&lt;Person&gt; 的转换将被视为具有空引用并会生成警告。但是使用 null-forgiving 运算符,它被视为具有非 null 引用(否定警告)。

    【讨论】:

      【解决方案2】:

      您的方法声明不匹配。

      尝试改变这个:

      IList<Person> GetPersons()
      

      到这里:

      IList<Person?> GetPerson
      

      【讨论】:

      • 问题询问如何这样做,因为该方法已经确保结果不为空
      【解决方案3】:
      enumerable.Where(t=> t!=null).Cast<Person>();
      

      我们想要/需要的是一个 Null 检查 linq 谓词/函数,它将接受对象?并输出对象

         public static class NullableExtension {
      
              public static IEnumerable<TValue> WhereNotNull<TValue>(this IEnumerable<TValue?> list)
              {
                  return list.Where(x => x != null).Cast<TValue>();
              } 
          }
      

      允许你写

      IList<Person> GetPersons()
      {
         return someList.WhereNotNull();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多