2011-06-21 9 views
4

私はジェネリックインターフェイスIComparisonを実装しているVisual Studio 2008 C#2.0 CFプロジェクトを持っています。 IComparison.Compareメソッドは、指定されたオブジェクトに対して有効な任意の型の比較を行うために呼び出すことができます。したがって、型制約を入れたくありません。タイプ制約を持つジェネリックインターフェイスを実装する

public interface IComparison<EXPECTED_PARAM> 
{ 
    Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned); 
} 

しかし、実装は、より具体的にすることができます。この場合、GreaterThan.Compareに与えられたパラメータは、System.IComparableによってコンストラクタで与えられたEXPECTED_PARAMと比較することができます。

public class GreaterThan<EXPECTED_PARAM> : IComparison<EXPECTED_PARAM> 
{ 
    private EXPECTED_PARAM expected_; 

    public GreaterThan(EXPECTED_PARAM expected) 
    { 
     expected_ = expected; 
    } 

    public Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned) 
     where RETURNED_PARAM : IComparable<EXPECTED_PARAM> 
    { 
     return ((returned == null && expected_ == null) || 
       (returned != null && returned.CompareTo(expected_) > 0)) ? 
       Result.Fail : Result.Pass; 
    } 
} 

残念ながら、これは私にエラーを与える:

error CS0460: Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly 

私はRETURNED_PARAMオブジェクトとEXPECTED_PARAMオブジェクトの任意の比較を実行する能力を得るために行うために何が必要ですか?これについて

おかげで、 PaulH

答えて

2

どのように?

+0

これはおそらく私がしなければならないことです。私が好きでないのは、 'Compare'が呼び出されるまで' RETURNED_PARAM'型を知る必要がなかったことだけです。このために、私は両方の型を構築時に知る必要があります。ありがとう! – PaulH

+0

問題がなければ答えを受け入れることができます。ありがとう:) – boca

0

継承階層が問題です。 GreaterThanIComparison<EXPECTED_PARAM>から継承します。つまり、Compare<EXPECTED_PARAM>を実装しているとコンパイラに伝えていますが、代わりにCompare<RETURNED_PARAM>を実装します。

public interface IComparison 
{ 
    Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned) 
    where RETURNED_PARAM : IComparable; 
} 

public class GreaterThan<EXPECTED_PARAM>: IComparison 
{ 
    private EXPECTED_PARAM expected_; 

    public GreaterThan(EXPECTED_PARAM expected) 
    { 
     expected_ = expected; 
    } 

    public Result Compare<RETURNED_PARAM>(RETURNED_PARAM returned) 
     where RETURNED_PARAM : IComparable 
    { 
     return ((returned == null && expected_ == null) || 
       (returned != null && returned.CompareTo(expected_) > 0)) ? 
       Result.Fail : Result.Pass; 
    } 
} 
+0

'IComparison'インタフェースから型制約を削除した場合、'エラーCS0460:オーバーライドと明示的なインタフェース実装のメソッドの制約が基本メソッドから継承されるため、直接指定することはできません。 'また、ボクシング/アンボクシングを避けるために、一般的な 'IComparable <>'インターフェースを好む。 – PaulH

+0

@ Paul私は私のサンプルコードを(再)テストしてコンパイルします。あなたは私のものと違って見えますか? –

+0

はい、投稿としてコンパイルされましたが、IComparison.Compareインターフェースからジェネリック制約を削除することに言及しました。私が 'RETURNED_PARAM:IComparable'を削除すると、コンパイルされません。 – PaulH

関連する問題