gpt4 book ai didi

c# - 从 'V'到 'System.IEquatable'没有装箱转换或者类型参数转换

转载 作者:太空狗 更新时间:2023-10-29 23:00:26 24 4
gpt4 key购买 nike

我有以下扩展方法,它们编译成功并按设计运行。

public static IEnumerable<T> WhereNotEmpty<T>(this IEnumerable<T> source) where T : struct {
return source.Where(item => !item.Equals(default(T)));
}

public static IEnumerable<V> SelectNotEmpty<T, V>(this IEnumerable<T> source, Func<T, V> selector) where V : struct {
return source.Select(selector).WhereNotEmpty();
}

但是,为了避免装箱,我添加了一个新的通用约束,如下所示:

public static IEnumerable<T> WhereNotEmpty<T>(this IEnumerable<T> source) where T : struct, IEquatable<T> {
return source.Where(item => !item.Equals(default(T)));
}

public static IEnumerable<V> SelectNotEmpty<T, V>(this IEnumerable<T> source, Func<T, V> selector) where V : struct, IEquatable<T> {
return source.Select(selector).WhereNotEmpty(); // compile error!
}

我现在在 SelectNotEmpty 调用 WhereNotEmpty 时遇到编译错误:

The type 'V' cannot be used as type parameter 'T' in the generic type or method 'MyExtensions.WhereNotEmpty(System.Collections.Generic.IEnumerable)'. There is no boxing conversion or type parameter conversion from 'V' to 'System.IEquatable'.

我确定我犯了一个愚蠢的错误,但我看不到它。谁能帮我指出一下?

最佳答案

你对V的约束应该是

where V : struct, IEquatable<V>

类型T在 WhereNotEmpty 中应该是 IEquatable<T>你正在传递 IEnumerable<V>进入WhereNotEmpty来自 SelectNotEmpty应用转换后。

public static IEnumerable<V> SelectNotEmpty<T, V>(this IEnumerable<T> source, Func<T, V> selector) where V : struct, IEquatable<V>
{
return source.Select(selector).WhereNotEmpty();
}

关于c# - 从 'V'到 'System.IEquatable<V>'没有装箱转换或者类型参数转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15683807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com