0

我在通过引用传递对象时遇到问题。假设我有一个名为的对象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);
}

现在编译器又高兴了。所以我的问题是,为什么代码最初会破坏?为什么编译器不能意识到被引用的对象与定义的参数类型相同?

4

1 回答 1

3

你可能不需要ref.

示例为什么ref不允许您的代码:

 void Method(ref MyBase v)
 {
      v = new MyBase();
 }

 MyDerived d = null;
 Method(ref d);

如果允许,将分配MyBase类似于MyDerived以下明显错误的代码:

 MyDerived d = new MyBase(); 
于 2013-08-02T23:45:43.920 回答