2010-12-31 1 views
-1

BindingListのカスタムサブクラス<T>は、便利な拡張メソッドを使用してLINQクエリを実行したいです。たとえば、次のようにBindingListのカスタムサブクラスでIEnumerable <T>拡張メソッドにアクセスするにはどうすればいいですか<T>?

public int GetSum(MyList<T> list) 
{ 
    return list.Sum(x => x.Value); 
} 

しかし、コンパイラは、これが動作するためには、それは明らかである、IEnumerable<T>としてlistを認識しないので、それがSumを解決できないと文句を言います:

public int GetSum(MyList<T> list) 
{ 
    return ((IEnumerable<T>)list).Sum(x => x.Value); 
} 

誰もが持っています私は醜いと不必要なキャストを避けることができる賢い方法?

答えて

1

Sumが実行しようとしている型引数についてコンパイラが推論できないように見えるので、推論できません。このように型引数を指定することができます。ここで、TはSumを実行するタイプです。

return list.Sum<T>(x => x.Value); 

あなたのサンプルのいずれも、型引数を設定せずにベースBindingList<T>に戻す場合でも、私のためにコンパイルされることが注目されるべきです。

+0

これは...そうでなければなりません...タイプに複数のIEnumerable 実装があると思いますか? – Dan

+0

@ダンあなたの合計(x => x.Value)x.Valueは、この式がすべてのオブジェクトにわたって何かに評価できる能力を削除します。適切に評価するためにValueプロパティが必要な型を指定するようになりました。 Sum拡張メソッドのtype引数に型を指定しない限り、式の評価方法はわかりません。 –