2009-07-08 6 views
1

配列のようなクラスをスライスできる拡張を作成しようとしていました(標準ライブラリではスライスが奇妙に存在しません)。たとえば:C#:エクステンションの複数の型パラメータ

public static M Slice<M,T>(this M source, int start, int end) where M : IList<T> 
{ 
    //slice code 
} 

しかし、タイプMのオブジェクトにこの方法を添付していないコンパイル(そのエラーメッセージはそれがあると主張しているにもかかわらず、それが探しているもの)。むしろ、メソッド自体の型パラメータに依存するように思われる。何らかの形で、しかし私は物事がどのように働いているか完全に理解していません。

(はい、1だけで簡単に一覧で動作例を書くことができますが、これも可能である場合、私は興味があります。)

答えて

3

あり、コンパイラは、このような場合のために、自動的にタイプTを推測することはありません。たとえそれが拡張メソッドではなかったとしても、タイプパラメータを手動で指定する必要がありました。

クラスは次のように宣言された場合、どのような例えば

:あなたはTがあることを期待する何

class MyNastyClass : IList<int>, IList<double> { 
} 

intまたはdouble?その結果、あなたは常に手動で特定のパラメータでそれを呼び出す必要があります:することにより

public static void Slice<M>(this IList<M> source, int start, int end) 

Slice(myList, 0, 10); // compile-time error, T cannot be inferred. 
Slice<IList<int>, int>(myList, 0, 10); // works. 

この問題を回避するには、typeパラメータT(ここでは必要な制約なし)を削除することですこれは決してパラメータの数には関係しないことに注意してください。コンパイラがそれらを推論できる限り(C#仕様のジェネリック型推論規則に従って)、好きなだけ多くの型パラメータを持つことができます。たとえば、この拡張メソッドは、型引数を指定せずに呼び出すことができます。

public static void SomeMethod<T,U>(this IEnumerable<T> collection, U anotherParameter) 
0

あなたがList.GetRange methodで見たことがありますか?

+0

はい、申し訳ありませんが、私は詳細コピーを行っていました。さもなければGetRangeは完璧です。 – Ender

関連する問題