代码之家  ›  专栏  ›  技术社区  ›  Good Night Nerd Pride

如何防止方法组丢弃泛型引用类型的可空性元信息?

  •  0
  • Good Night Nerd Pride  · 技术社区  · 3 年前

    考虑这个通用身份函数:

    T Id<T>(T x) => x;
    

    如果我在lambda映射中使用它,则数组中的元素 string? 值,它按预期工作(即,它保留了值可以为null的信息)。

    var xs = new[] { (string?)"foo" };
    
    var ys = xs.Select(x => Id(x)); // inferred type of `ys` is IEnumerable<string?>
    string y = ys.Single();         // warning CS8600: Converting [...] possible null value to non-nullable type.
    

    但是,如果我将其用作方法组,则信息将被丢弃。

    var xs = new[] { (string?)"foo" };
    
    var ys = xs.Select(Id); // inferred type of `ys` is IEnumerable<string>
    string y = ys.Single(); // no warning CS8600
    

    这是怎么回事?这是编译器错误还是已知的可为null的引用类型限制?

    作为变通办法,我可以声明 Id 如下所示,以获得第二个示例中的预期警告:

    T? Id<T>(T? x) => x;
    

    但对我来说,这似乎过于表达了。

    我使用的是C#10.0。

    工作示例: https://dotnetfiddle.net/SEHIb6

    0 回复  |  直到 3 年前
    推荐文章