我在通过引用传递对象时遇到问题。假设我有一个名为的对象ViewModelBase
,其定义如下:
public class ViewModelBase : IViewModelManager
{
public ViewModelBase()
{
}
// IViewModelManager implementation
}
然后,我定义了另一个继承自的对象ViewModelBase
:
public class ExternalAssetViewModel : ViewModelBase
{
public ExternalAssetViewModel()
{
}
}
然后我创建一个名为 的静态类NotificationHandler
,它包含一个视图模型引用列表,因此一旦收到服务器通知,它就可以正确更新视图模型:
public static class NotificationHandler
{
private static List<ViewModelBase> viewModelReferences = new List<ViewModelBase>();
public static void AddViewModelReference(ref ViewModelBase viewModel)
{
viewModelReferences.Add(viewModel);
}
}
所以现在,每次我创建一个需要更新的新视图模型时,我都会将它添加到这个静态列表中:
ExternalAssetViewModel viewModel = new ExternalAssetViewModel();
NotificationHandler.AddViewModelReference(ref viewModel);
但是,这会失败并出现以下编译错误:
Argument 1: cannot convert from 'ref ExternalAssetViewModel' to 'ref ViewModelBase'
即使ExternalAssetViewModel
继承自ViewModelBase
,所以在技术上ExternalAssetViewModel
也是 类型ViewModelBase
。我可以通过更改AddViewModelReference
为采用通用参数来解决此问题,然后为该参数定义一个约束:
public static void AddViewModelReference<T>(ref T viewModel) where T : ViewModelBase
{
viewModelReferences.Add(viewModel);
}
现在编译器又高兴了。所以我的问题是,为什么代码最初会破坏?为什么编译器不能意识到被引用的对象与定义的参数类型相同?