如何解决为什么我不能为可为空的泛型参数使用可为空的元组
所以我想知道您是否可以创建一个扩展方法来结合 .Where()
和 .Select()
的功能,用于过滤列表的空值并保持类型与 Nullable 一致的特殊情况引用类型。这意味着如果我得到一个 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
然而,这根本不适用于引用类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。