2016-10-27 9 views
8

私はC#(仕事の経験で6ヶ月)にはかなり新しいですが、Javaとかなり似ているので、私は自宅にいるように感じます。なぜIComparerは、Compare(Object x、Object y)だけでなく、IComparer.Compare(Object x、Object y)を定義する必要がありますか?

はしかし、今日私はIComparerインターフェイスを実装しようと、それは私にエラーを与えていた理由を疑問に思った:

public class AlphabeticalReportSort : IComparer 
{ 
    int Compare(Object x, Object y) 
    { 
     return 0; 
    } 
} 

それはそれを実装する必要がありますように思えて:私はdidnの

public class AlphabeticalReportSort : IComparer 
{ 
    int IComparer.Compare(Object x, Object y) 
    { 
     return 0; 
    } 
} 

これを必要とするインターフェース宣言には何も気づかず、C#のように普通はこれをする必要はありません。

誰でも知っていますか?

+2

いいえ、そうではありません。インターフェイスを実装するには、最初のバージョンのメソッドをpublicにするだけです。 –

+0

もちろん、Jon Skeetは正しいです。これらのメソッドは、インタフェースから呼び出すことができるため、インタフェースが型としてアクセス可能な場所から実装する必要があるため、public *実装する必要があります。詳細については、[そのリンク](http://stackoverflow.com/questions/7238575/why-must-an-c-sharp-interface-method-implemented-in-a-class-be-public)を参照してください。 –

答えて

9

Why does IComparer require you to define IComparer.Compare(Object x, Object y) and not just Compare(Object x, Object y)?

これはありません。完全なエラーメッセージは次のとおりです。

'AlphabeticalReportSort' does not implement interface member 'IComparer.Compare(object, object)'. 'AlphabeticalReportSort.Compare(object, object)' cannot implement an interface member because it is not public.

2番目の文に注意してください。 int Compare()メソッドはプライベートであり、publicではないため、インターフェイスメソッドの実装としては機能しません。

int IComparer.Compare()は明示的な実装であり、明示的なインターフェイスの実装は常にpublic(すべてのインターフェイスのメンバはpublic)であるためコンパイルされるため、アクセス修飾子は不要です。しかし、あなたのケースでは、あなたのメソッドを単にパブリックにするだけで十分です。非常にめったにあなたはインターフェイスメソッドを明示的に実装する必要があります、そして、私が知っている限り、インターフェイス定義自体にこれを実際には必要としません。

+0

ああ、ばかげたミス!ありがとう。 – RickySpanish

関連する問題