2012-02-10 10 views
8

私は戻り値の型をオーバーロードできないことを知っています(私はこれを知っていると思います)。ISetには戻り値の型によってのみ異なる2つのAdd(Tアイテム)メソッドがありますか?

void F() 
{ 
} 

bool F() 
{ 
    return true; 
} 

..producesエラーalready defines a member called 'F' with the same parameter types

しかし、私はdocumentation for ISet from MSDNを読んでいる、と私は2だけ戻り値の型によって異なるメソッドの追加を参照してくださいと思います。

ここでは何が起こっていますか?

+0

答えをありがとう、私は無作為に答えとしてマークする1つを選択します –

答えて

4

最初の「追加」メソッドは、実際にはICollection<T>.Addであり、継承されています。そのように、

void ICollection<T>.Add(T item) 
{ 
    // ... Implement here 
+0

ちょうど不思議なことに、あなたは「クラスで実装されています」と言っています - それは構造体に実装されているのとは違いますか? –

+0

@Gabrielいいえ - どのタイプでも実装されています。つまり、 'ISet 'を実装している構造体は**非常に**不適切です。 ;)構造体の推奨される要件のいずれにも適合しません。16バイトを超えたり、変更可能であるなどです。 –

4

Addの方法はexplicitly implemented interface methodです。

インターフェイスメソッドが明示的に実装されている場合、インターフェイスの型への参照を最初にキャストせずに呼び出すことはできません。これにより、呼び出しが明白になり、同じシグネチャを持つ複数のメソッドが正常です。あなたのコードでこれを行うには

、あなたがしたい、例えば

class MyCollection<T> : ICollection<T> { 
    public void Add() { ... } 
    void ICollection<T>.Add() { ... } 
} 

これは、インターフェイスメソッドを希望する場合、インタフェース名との衝突を避けるために、別のメソッド名を思い付くする必要がなくなります他の方法とは少し違ったやり方をする。

+1

明示的に実装されたインターフェイスメソッドが他のAddメソッドだと言うと間違っています。明示的に*実装された*インタフェースメソッドはクラス/構造体にしか現れず、インタフェースはクラス/構造体の外側に*実装*を持つことができないので、インタフェース上にneverを出すことができます。あなたが言及している両方のメソッドは、インターフェイスメソッドです.1つはISetに、もう1つはICollectionにあり、これらのインターフェイスを実装するクラスは明示的に実装されていません。おそらくあなたはより良い言葉遣いを使うことができます。 –

+0

@zespri:そうです。私はページを適切に見ていないし、クラスではなくインターフェイスであることに気付かなかった。あなたは答えとしてコメントを投稿するべきです、なぜならここにはインターフェイスとクラスの違いがあるからです。 –

3

インターフェイスのメソッドを明示的に実装できます。これはクラスで実装されている場合

、2つのAdd方法の少なくとも1つは、明示的にすなわち、実装する必要があります

public class Something : IINterface1, IInterface2 
{ 
    public bool DoSomething(); 
    public void IInterface2.DoSomething(); 
} 

voidを返すメソッドは、インターフェイスにクラスをキャストした場合にのみアクセス可能です:

Something s = new Something(); 
IInterface2 i = (IInterface2)s; 
i.DoSomething(); // method returning void 
関連する問題