4

2 つのインターフェイス (および)Cから継承するクラスがあるとします。メソッド ( ) の 2 つのバージョンもあり、それぞれがパラメーターとしてインターフェイスの 1 つを取ります。を呼び出すと、どちらが呼び出されますか?I1I2DoStuffDoStuff(C)

interface I1 { ... }
interface I2 { ... }
class C : I1, I2 { ... }

int DoStuff(I1 target) { ... }
int DoStuff(I2 target) { ... }

//What gets called here?
C target = new C()
DoStuff(target)

I2から派生する場合I1、比較的単純だと思います-I2バージョンが呼び出されます。インターフェイスが独立している場合に興味があります。

CI1またはを編集できないとしますI2。そして、それが違いを生むなら.NET 2.0。

4

3 に答える 3

15

どちらも呼び出されません。2 つのメソッドが同じクラスのオーバーロードである場合、コンパイラはあいまいさを解消しようとはしません。両方のインターフェイスtargetを実装する型であると宣言したため、2 つのオーバーロードがあいまいであると言って、単にコードをコンパイルしません。

インターフェイス型のいずれかであると宣言targetするか、呼び出し時にキャストする場合 (Jon が示すように)、あいまいさはありません。

于 2011-09-08T10:31:47.580 に答える
6

BoltClock が言うように、コンパイルされません。ただし、やりたいことを実行するのは簡単です。引数に使用したい型の式を使用するだけです。例えば:

C target = new C();
DoStuff((I1) target);

また

C target = new C();
I1 i1 = target;
DoStuff(i1);

基本的に余分な作業をしなくても、オーバーロードの解決手順は候補セット内の両方のメソッドを見つけ、どちらも他方よりも「優れている」と判断するため、オーバーロードの解決は失敗します。

于 2011-09-08T10:34:40.337 に答える
3

コンパイルしようとすると、次のエラーが発生します。

エラー CS0121: 次のメソッドまたはプロパティの間で呼び出しがあいまいです: 'DoStuff(I1)' と 'DoStuff(I2)'"

于 2011-09-08T10:35:51.507 に答える