次の拡張メソッドがあります。これらは正常にコンパイルされ、設計どおりに動作します。
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
:
型 'V' は、ジェネリック型またはメソッド 'MyExtensions.WhereNotEmpty(System.Collections.Generic.IEnumerable)' で型パラメーター 'T' として使用できません。'V' から 'System.IEquatable' へのボックス変換や型パラメーターの変換はありません。
私はばかげた間違いを犯したと確信していますが、それを見ることはできません。誰か教えてください。