2012-09-21 74 views
5

說,我有一個接口爲什麼不能從接口定義到類的隱式轉換運算符?

public interface ISomeControl 
{ 
    Control MyControl { get; } 
    ... 
} 

是否有可能定義水木清華這樣的:

public static implicit operator Control(ISomeControl ctrl) 
{ 
    return ctrl.MyControl; 
} 

或者說爲什麼我不能在C#這樣做嗎?

+2

答案是:沒有 – leppie

+1

@leppie我錯過了什麼?爲什麼這種方法絕對錯誤? – horgh

+0

初學者的界面不能有任何實現,所以你無處可以定義該運算符 – Jamiec

回答

5

如果你具有Control一個子類,而子類實現了ISomeControl接口。

class SomeControl : Control, ISomeControl {} 

現在演員陣容不明確 - 內置upcast和用戶定義的轉換。所以你不能爲接口提供用戶定義的轉換。

+0

這非常好理解+1 – leppie

+0

我可以理解,允許從接口轉換到類類型是不明確的,但是如果類定義從界面到自身的轉換運算符。如果存在從「BaseType」到「Foo」的轉換,則「DerivedType」類也可以定義到「Foo」的轉換,而不會產生歧義。如果一個類沒有實現一個特定的接口而是一個子類,那麼將一個基類型引用轉換爲該接口應該使用用戶定義的轉換(不管被引用的對象是否實現該接口)... – supercat

+0

... while使用派生類引用應該使用爲派生類靜態定義的轉換。即使在'Foo :ISomething '指定轉換爲'ISomething '我沒有看到接口會導致類不會產生任何「問題」。 – supercat

1

你不能那樣做。

C#規範說:

6.4.1允許用戶定義的轉換

C#許可證被聲明僅某些用戶定義的轉換。特別是,在 中,不可能重新定義已存在的隱式或顯式轉換。對於給定源類型S和目標類型T,如果S或T是可爲空的類型,則讓S0和T0參考它們的基本類型,否則S0和T0分別等於S和T 。類或結構允許聲明從源類型S轉換 到目標類型T僅當以下所有 的爲真:

  • S0和T0是不同的類型。

  • S0或T0是運算符聲明發生的類或結構類型。

  • S0和T0都不是接口類型。

  • 剔除用戶定義的轉換,轉換不存在從S到T或從T到S.

你能做到

的一種方式是具有靜態方法。

public class Control 
    { 
     public static Control FromISomeControl(ISomeControl ctrl) 
     { 
      return ctrl.MyControl; 
     } 
    } 
+0

這不解決「爲什麼?」。另外,我想他是在談論微軟提供的Control類,所以你不能添加它。 –

+0

我不知道這是否是框架控件類。我認爲這只是一個例子。 – Roland

+0

'Control'是*微軟提供的*類 – horgh

相關問題