小编典典

强制转换 通用

c#

我有一个基本的WPF UserControl,它处理派生UserControl的一些常用功能。在任何派生的UserControl的代码背后,我调用一个事件

private void SomeClick(object sender, RoutedEventArgs e) {
    HandleClick(sender);
    MyDataGrid.Items.Refresh();
}

在我的基本UserControl中,

public class BaseUserControl : UserControl {
   protected void HandleClick(object sender) {
       var vm = (BaseViewModel<Part>)DataContext;
       ...
   }
}

抛出 InvalidCastException,
因为DataContext它是类型,BaseViewModel但具有派生类型,例如BaseViewModel<Wire>BaseViewModel<Connector>

我该如何投放?


阅读 251

收藏
2020-05-19

共1个答案

小编典典

您不能将强制Generic<Derived>转换为Generic<Base>

试想一下,如果可以。您有一个List<Wolf>并将其转换为List<Animal>。现在,你可以.Add()一个SheepList<Animal>。但请稍候…现在您的中List<Wolf>包含一个Sheep。真是一团糟。

仅当您可以确保投射到的东西以所有可能的形式为只读时,这才可行。这就是协和,而协方差就是这样。但是,它仅适用于接口。

2020-05-19