[英]C# Casting Not Working
我有這些類,部分列出了相關位。
public class IVRTopology {}
public abstract class SANSwitch
{ public string name { get; set; }
}
public class CiscoSwitch : SANSwitch
{
public IVRTopology IVRTop = new IVRToplogy()
}
class SwitchViewModel : INotifyPropertyChanged
{
public SANSwitch sanswitch { get; set; }
}
當我做這樣的事情:
SwitchViewModel svm = new SwitchViewModel();
svm.sanswitch = new CiscoSwitch();
IVRTopology topo = svm.sanswitch.IVRTop;
編譯器警告我svm.sanswitch是SANSwitch類型,並且如果我嘗試這樣訪問IVRTop,則沒有IVRTop的定義:
IVRTopology topo = (CiscoSwitch)svm.SANSwitch.IVRTop
也不起作用。 我不想將IVRTopology的定義添加到抽象類中,因為我將擁有其他不使用它的子類。 演員陣容有問題嗎? 我該如何進行這項工作? 我希望視圖模型最終支持各種開關。
強制轉換的優先級低於.
操作員。
因此,當您運行以下代碼時:
IVRTopology topo = (CiscoSwitch)svm.SANSwitch.IVRTop
您正在有效地跑步
var ivrTop = svm.SANSwitch.IVRTop;
IVRTopology topo = (CiscoSwitch)ivrTop;
簡單的解決方法是使用括號來強制使用正確的分辨率:
IVRTopology topo = ((CiscoSwitch)svm.SANSwitch).IVRTop
你鑄造的結果svm.SANSwitch.IVRTop
,當你真正想投svm.SANSWitch
首先是這樣的:
((CiscoSwitch) svm.SANSwitch).IVRTop
甚至更好的是,在C#中您可以安全地進行強制轉換(由於(CiscoSwitch) svm.SANSwitch
如果類型錯誤,則可能會引發錯誤),因此您可以執行以下操作:
(svm.SANSwitch as CiscoSwitch)?.IVRTop
首先我們對CiscoSwitch
進行安全的CiscoSwitch
,該CiscoSwitch
可能為null,然后我們將null傳播?
並獲取值。 僅當結果值不為null時,Null Propagation才有效-因此此行中的所有內容都非常安全。 然后,您可能首先要檢查它是否成功。
您的語法錯誤。
IVRTopology topo = ((CiscoSwitch)svm.SANSwitch).IVRTop;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.