繁体   English   中英

为什么我不能将可空元组用于可空泛型参数

[英]Why can't I use a nullable tuple for a nullable generic parameter

所以我想知道你是否可以创建一个扩展方法,将.Where().Select()的功能结合起来,用于过滤掉列表的 null 值并保持类型与可空引用类型一致的特殊情况。 这意味着如果我得到一个string?[]它将过滤掉所有null值并返回一个没有可为空字符串的IEnumerable<string>

但是,当我尝试过滤出如下所示的可空元组时,我收到编译器错误,即预期不可空元组类型。 为什么此解决方案适用于所有常规类型但不适用于元组,以及如何更改我的扩展方法以也适用于元组。

扩展方法:

public static IEnumerable<TResult> SelectNotNull<TSource, TResult>
(this IEnumerable<TSource> enumerable, Func<TSource, TResult?> selector)
{
    foreach (var item in enumerable)
        if (selector(item) is { } result)
            yield return result;
}

产生编译器错误的示例代码:

(string?, int)[] arr = Array.Empty<(string?, int)>();

static (string, int)? Selector((string?, int) x)
{
    return x.Item1 != null ? x : null;
}

arr.SelectNotNull<(string?, int), (string, int)>(Selector);

没有约束,你的TResult? 被解释为引用类型可空性注释(如果未启用引用类型可空性,您应该看到 CS8632 警告,或者如果使用早期的 C# 编译器版本,则会看到硬错误) - 可空性注释只是建议性 他们不会改变任何艰难的行为。 使用值类型获得您似乎想要的行为,您可以添加:

public static IEnumerable<TResult> SelectNotNull<TSource, TResult>
(this IEnumerable<TSource> enumerable, Func<TSource, TResult?> selector)
    where TResult : struct // <== add constraint

但是,这根本不适用于引用类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM