无法执行显式转换

时间:2013-01-29 17:19:27

标签: c# generics activator

你能否在这段代码中澄清为什么:

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 个答案:

答案 0 :(得分:12)

强制转换运算符的优先级低于成员访问运算符。

(A)B.C();

被解析为

(A)(B.C());

这不是法律声明。你应该写

((A)B).C();

如果您要将B转换为A,然后在C()类型上致电A

为了将来参考,优先级表在这里:

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

答案 1 :(得分:2)

为什么不尝试以下操作,以便将您的视图对象声明为IView而不是对象?

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

答案 2 :(得分:0)

您可以在实例化时将其强制转换,然后如果多次使用它,则不需要每次都重新创建它。

var view = (IView)Activator.CreateInstance(viewTypeMap[typeof(TView)]);
view.ShowDialog();

答案 3 :(得分:-1)

更改

(IView)view.ShowDialog();

((IView) view).ShowDialog();

Eric解释了为什么