2011-02-02 15 views
5

私は次のクラスを持っていると私はExportFileBaseBLクラスからメソッドを比較呼び出ししようとしていますが、私はエラーを取得C#のジェネリック - ジェネリッククラスからジェネリックメソッドを呼び出す

暗黙的に「T」を型「クラス1」を変換できません。 。明示的な変換は、(あなたがキャストが欠けている?)

public abstract class Class1<T> where T: Class2 
{ 
    public abstract Class1<T> Compare(Class1<T> otherObj); 
} 

public abstract class Class3<T, U> where T: Class1<U> 
         where U: Class2 
{ 
    public T Compare(T obj1, T obj2) 
    { 
     if (obj1.Prop1 > obj2.Prop1) 
     { 
      return obj1.Compare(obj2); // Compiler Error here 
     } 
     else 
     { 
      return obj2.Compare(obj1); // Compiler Error here 
     } 
    } 

} 

存在型変換が暗黙的ではないでしょうか?何か不足していますか?

答えて

4

問題があなたの抽象Compare方法は、タイプClass1<T>のパラメータを受け入れ、返すように定義されていることですClass1<T>のインスタンス、、より具体的にはタイプ、Class1<T>のタイプである。しかし、これはあなたのClass3.Compareメソッドがしようとしているものです:T.Compareを呼び出して、実際にはClass1<U>であることを確かめることができるときは、出力はTと仮定します。

私はこのクラスを持っていたと仮定し、よりシンプルで分かりやすい例を提供する:

class Parser 
{ 
    public abstract object Parse(string text); 
} 

class Int32Parser 
{ 
    public int Parse(Parser parser, string text) 
    { 
     return parser.Parse(text); 
    } 
} 

上記のコードは、あなた自身に似た障害のある仮定作る:intobjectから派生しているためparser.Parseがちょうどintを返すことを(あなたの場合と同じように、TClass1<U>から派生しなければなりません)。実際には、objectが返ってくるかどうかだけを確かめることができます。

私はこの問題を解決するために見ることができる2つの方法があります:Class1<T>.Compareジェネリックメソッドます

public abstract U Compare<U>(U otherObj) where U : Class1<T>; 

を...またはあなたのClass3.Compareメソッドの戻り値の型特異性をリラックス:

public Class1<U> Compare(T obj1, T obj2) 
{ 
    // ... 
} 
は、

個人的には、最初のものが絶対に必要な場合を除き、私は2番目を好むでしょう。これらのジェネリック型の制約はすべて、このように複雑さが増し始めると、あなたが予想していたよりもはるかに面倒で負荷がかかることがあります。

+0

ダン、おかげで私の質問に答えます。 – logik6

+0

Jup jup。これで、比較メソッドの型に関する更新が追加されたので、私はその答えに同意します。 – jcolebrand

2

クラスレベルで宣言するパラメータタイプのメソッドを呼び出します。

return obj1.Compare<T>(obj2); 

あなたにも、一般的なCompareメソッドの定義を作成する必要があります:

public abstract Class1<T> Compare<T>(Class1<T> otherObj); 
+1

Compareメソッドは一般的ではないため、現在のフォームに型パラメーターを受け入れません。 –

+0

しかし@Kyleは、親コードでどこを修正する必要があるかを示しています。彼はまた、最初のクラス比較メソッドに ''を追加する必要があります。 – jcolebrand

+0

これは答えに追加する必要があります。私はそれを追加します。 –

関連する問題