5

このコードの理由を明確にしてもらえますか:

private Dictionary<Type, Type> viewTypeMap = new Dictionary<Type, Type>();

public void ShowView<TView>(ViewModelBase viewModel, bool showDialog = false)
    where TView : IView
{
    var view = Activator.CreateInstance(viewTypeMap[typeof(TView)]);
    (IView)view.ShowDialog();
}

エラーが発生します:

「ステートメントとして使用できるのは、割り当て、呼び出し、インクリメント、デクリメント、および新しいオブジェクト式のみです。」

IView は ShowDialog() メソッドを定義します。

4

4 に答える 4

12

キャスト演算子は、メンバー アクセス演算子よりも優先順位が低くなります。

(A)B.C();

として解析されます

(A)(B.C());

これは法的声明ではありません。あなたは書くべきです

((A)B).C();

にキャストBしてからtypeAを呼び出す場合。C()A

今後の参考のために、優先順位表は次のとおりです。

http://msdn.microsoft.com/en-us/library/aa691323(v=VS.71).aspx

于 2013-01-29T17:21:35.017 に答える
2

ビューオブジェクトが object ではなく IView として宣言されるように、次のことを試してみませんか?

public void ShowView<TView>(ViewModelBase viewModel, bool showDialog = false) where TView : IView
{
    var view = (IView)Activator.CreateInstance(viewTypeMap[typeof(TView)]);
    view.ShowDialog();
}
于 2013-01-29T17:26:37.960 に答える
0

インスタンス化されているときにキャストできます。複数回使用する場合は、毎回再キャストする必要はありません。

var view = (IView)Activator.CreateInstance(viewTypeMap[typeof(TView)]);
view.ShowDialog();
于 2013-01-29T17:26:21.137 に答える
-1

変化する

(IView)view.ShowDialog();

((IView) view).ShowDialog();

エリックは理由を説明した

于 2013-01-29T17:23:13.857 に答える