オブジェクトの参照渡しに問題があります。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);
}
これで、コンパイラは再び満足しています。だから私の質問は、なぜコードが最初に壊れていたのですか? 参照されているオブジェクトが定義されたパラメーターと同じ型であることをコンパイラーが認識できないのはなぜですか?