これは「明示的なインタフェースの実装」と呼ばれます。この理由は、たとえば命名の競合である可能性があります。
インターフェイスIEnumerable
とIEnumerable<T>
を考えてみましょう。そこだけ戻り値の型が異なる同じ名前の2つのメソッドを持つことが許されていないC#では
IEnumerator<T> GetEnumerator();
:一つは、非ジェネリックメソッド
IEnumerator GetEnumerator();
と一般的な一つの他を宣言します。明示的に実装されたインタフェースのメソッドは、インスタンス変数に呼び出すことはできません
public class MyEnumerable<T> : IEnumerable, IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
... // return an enumerator
}
// Note: no access modifiers allowed for explicit declaration
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator(); // call the generic method
}
}
:
MyEnumerable<int> test = new MyEnumerable<int>();
var enumerator = test.GetEnumerator(); // will always call the generic method.
あなたが非を呼び出したい場合は、両方のインターフェイスを実装するのであれば、あなたは明示的な一つの方法を宣言する必要があります一般的な方法では、test
をIEnumerable
にキャストする必要があります。
((IEnumerable)test).GetEnumerator(); // calls the non-generic method
これは、明示的な実装ではアクセス修飾子(public
やprivate
など)が許可されていない理由のようです。
実装クラスに同じシグネチャを持つメソッドがある場合は、区別できるようにしてください。 – Tobias
明示的なインターフェイスの実装では、可視性修飾子を使用できません。私はあなたの質問に単純に間違って入力したと思うので、先に進んで編集しました。もしあなたが私が間違っていると思うならば、あなたは '公衆が本当にそこにいると思うならば、元気に戻すことができますが、あなたが持っていたものはコンパイルできません。 – hvd