說,我有一個接口爲什麼不能從接口定義到類的隱式轉換運算符?
public interface ISomeControl
{
Control MyControl { get; }
...
}
是否有可能定義水木清華這樣的:
public static implicit operator Control(ISomeControl ctrl)
{
return ctrl.MyControl;
}
或者說爲什麼我不能在C#這樣做嗎?
說,我有一個接口爲什麼不能從接口定義到類的隱式轉換運算符?
public interface ISomeControl
{
Control MyControl { get; }
...
}
是否有可能定義水木清華這樣的:
public static implicit operator Control(ISomeControl ctrl)
{
return ctrl.MyControl;
}
或者說爲什麼我不能在C#這樣做嗎?
如果你具有Control
一個子類,而子類實現了ISomeControl
接口。
class SomeControl : Control, ISomeControl {}
現在演員陣容不明確 - 內置upcast和用戶定義的轉換。所以你不能爲接口提供用戶定義的轉換。
這非常好理解+1 – leppie
我可以理解,允許從接口轉換到類類型是不明確的,但是如果類定義從界面到自身的轉換運算符。如果存在從「BaseType」到「Foo」的轉換,則「DerivedType」類也可以定義到「Foo」的轉換,而不會產生歧義。如果一個類沒有實現一個特定的接口而是一個子類,那麼將一個基類型引用轉換爲該接口應該使用用戶定義的轉換(不管被引用的對象是否實現該接口)... – supercat
... while使用派生類引用應該使用爲派生類靜態定義的轉換。即使在'Foo
你不能那樣做。
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;
}
}
答案是:沒有 – leppie
@leppie我錯過了什麼?爲什麼這種方法絕對錯誤? – horgh
初學者的界面不能有任何實現,所以你無處可以定義該運算符 – Jamiec