2011-09-08 32 views
1

假設我有一個繼承自2個接口(I1I2)的類C。我也有兩個版本的方法(DoStuff),每個方法都將一個接口作爲參數。如果我打電話給DoStuff(C),哪個人打電話?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) 

如果I2I1派生,我認爲這是比較簡單 - I2版本被調用。我對接口是獨立的情況感興趣。

假設我不能編輯C,I1I2。和.NET 2.0,如果這有什麼區別。

+1

一個非常有趣的問題! – trampi

+3

-1在問這個問題之前,你顯然沒有測試自己。 –

+0

有關運行時會發生什麼的問題需要關於實際編譯的代碼! (並且我不是在談論橢圓!) – AakashM

回答

12

都不被調用。如果你的兩個方法在同一個類中是重載的,那麼編譯器根本不會試圖消除歧義。它不會編譯你的代碼,說你的兩個過載之間是不明確的,因爲你聲明target是一個類型,它實現了兩個接口。

如果您聲明target是接口類型之一,或者在調用時拋出它(如Jon所示),那麼就沒有歧義。

+0

+1。我假設對DoStuff的調用是可以編輯的(否則它不會編譯),所以對I1或I2進行強制轉換將解決您的問題。 –

4

正如BoltClock所說,它不會編譯。然而,很容易讓它做你想做的事情:只需使用想要用於參數的類型的表達式。例如:

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

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

基本上沒有任何額外的工作,在重載步驟會發現在候選集兩種方法,並確定也不是比其他「更好」 ,所以重載分辨率將失敗。

相關問題