簡體   English   中英

C#轉換不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM