2

わかりました、これは非常に基本的な質問ですが、私はそれに出くわしました。次のクラスを検討してください。

public class WindowComparer: IComparer, Generic.IComparer<Window> { }

シナリオ 1: 私が通常宣言する方法。

public int Compare (object x, object y)
{
    return (this.Compare((Window) x, (Window) y));
}

public int Compare (Window x, Window y) {...}

シナリオ 2: MSDN ドキュメントで通常宣言されている方法。

int Collections.IComparer.Compare (object x, object y)
{
    // [this.Compare] is not recognized. How to access this?
    return (this.Compare((Window) x, (Window) y));
}

int Generic.IComparer<Window>.Compare (Window x, Window y) {...}

ただし、シナリオ 2 を試すと、Intellisense は Compare メソッドを失い、コンパイラは Compare メソッドが WindowComparer のメンバーではないというエラーを発生させます。私は何が欠けていますか?

4

4 に答える 4

5

2 番目のシナリオにはインターフェイスがIComparerあり、明示的に実装されているため、インスタンスを型またはIComparer<Window>型の変数に割り当てた場合にのみ、メソッドにアクセスまたは呼び出し可能になります。IComparer<Window>IComparer

WindowComparer comparer = new WindowComparer();

IComparer<Window> windowComparer = comparer;
// call methods of IComparer<Window> on windowComparer

IComparer normalComparer = comparer;
// call methods of IComparer on normalComparer

インターフェイスは明示的に実装され、クラスのパブリック インターフェイスを明確に保ち、​​インフラストラクチャ インターフェイスのメソッドを比較や等価性などのために非表示にします。

于 2013-06-11T07:24:58.950 に答える
1

2 番目のアプローチを使用すると、メソッドは、オブジェクトを 2 つのインターフェイスのいずれかのインスタンスとして宣言した場合にのみ機能します。

WindowComparer wcOne = new WindowComparer();
Generic.IComparer<Window> wcTwo = new WindowComparer();
IComparer wcThree = new WindowComparer();

この例では、明示的に実装されているため、 には 2 つのメソッドwcOneはありません。は の を使用でき、 は の を使用できます。ComparewcTwoGeneric.IComparer<Window>wcThreeIComparer

于 2013-06-11T07:25:07.640 に答える
0

インスタンスで明示的なインターフェース実装を呼び出すには、次のようにそのインターフェースキャストする必要があります。thisthis

return ((Generic.IComparer<Window>)this).Compare((Window)x, (Window)y);

ところで、クラスをSystem名前空間に入れていますか、それとも名前をusing宣言するエイリアスを持っていますGenericか?

于 2013-06-11T08:15:01.113 に答える