public interface IBaseUiItem
{}
public interface IButton : IBaseUiItem
{}
public class ControlBase : IBaseUiItem
{}
public class Button : ControlBase, IButton
{}
public I GetOne<I>() where I : IBaseUiItem
{
return (I)(new Button());
}
public I GetTwo<I>() where I : IBaseUiItem
{
object f = new Button();
return (I)f;
}
在上面為什么 GetOne() 不能編譯,但 GetTwo() 可以?換句話說,為什么第一種情況下的錯誤是“Connot convert type Button to I”
我嘗試使用“as”運算子來查看它是否有所作為(當然沒有運氣)。
我猜,GetOne 無法編譯,因為它可以讓您免于創建一個可能無法實作您提供給該方法的介面型別的實體(新按鈕)。
而且我理解“物件”如此普遍,使其成為轉換為任何型別的可能候選者。
最后,沒有特殊的介面獲取運算子這一事實不允許編譯器正確使用泛型,無論它是“介面泛型”還是“型別泛型”。
uj5u.com熱心網友回復:
換句話說,為什么第一種情況下的錯誤是“無法將型別按鈕轉換為 I”
因為I不保證是Button(或任何繼承IBaseUiItem并由實作的介面Button),即編譯器會阻止呼叫,例如:
public class NotAButton : ControlBase, IButton {}
var x = GetOne<NotAButton>();
使用object作為中間型別禁用此編譯器檢查(作為與任何其他 reference_type 的顯式轉換),您object將dynamic收到運行時錯誤:
GetTwo<NotAButton>();
System.InvalidCastException:無法將“Button”型別的物件轉換為“NotAButton”型別。
如果您希望能夠創建泛型的新實體,可以使用new 泛型約束:
I GetOne<I>() where I : IBaseUiItem, new()
{
return new();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530636.html
標籤:C#仿制药铸件
下一篇:Java中相同超類的2個類的介面
