C# 转换不起作用

Dav*_*een 1 c# casting

我有这些课程,部分列出了相关位。

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;  }
}
Run Code Online (Sandbox Code Playgroud)

当我做这样的事情时:

SwitchViewModel svm = new SwitchViewModel();
svm.sanswitch = new CiscoSwitch();
IVRTopology topo = svm.sanswitch.IVRTop;
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样访问 IVRTop,编译器会警告我 svm.sanswitch 属于 SANSwitch 类型,并且没有 IVRTop 的定义:

IVRTopology topo = (CiscoSwitch)svm.SANSwitch.IVRTop
Run Code Online (Sandbox Code Playgroud)

也不行。我不想将 IVRTopology 的定义添加到抽象类中,因为我将有不使用它的其他子类。演员阵容有问题吗?我怎样才能做到这一点?我希望视图模型最终支持不同类型的开关。

RB.*_*RB. 5

强制转换是优先级低于运算符的操作.

因此,当您运行以下代码时:

IVRTopology topo = (CiscoSwitch)svm.SANSwitch.IVRTop
Run Code Online (Sandbox Code Playgroud)

你正在有效地跑步

var ivrTop = svm.SANSwitch.IVRTop;
IVRTopology topo = (CiscoSwitch)ivrTop;
Run Code Online (Sandbox Code Playgroud)

简单的解决方法是使用括号强制正确的分辨率:

IVRTopology topo = ((CiscoSwitch)svm.SANSwitch).IVRTop
Run Code Online (Sandbox Code Playgroud)