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