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();

如果您要转换BA然后调用C()type A

供您将来参考,优先级表在这里:

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

于 2013-01-29T17:21:35.017 回答
2

为什么不尝试以下方法,以便将您的视图对象声明为 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 回答