Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法执行显式强制转换_C#_Generics_Activator - Fatal编程技术网

C# 无法执行显式强制转换

C# 无法执行显式强制转换,c#,generics,activator,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.CreateInstan

你能在这段代码中说明原因吗:

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();
}
private Dictionary viewTypeMap=new Dictionary();
public void ShowView(ViewModelBase viewModel,bool showDialog=false)
TView:IView在哪里
{
var view=Activator.CreateInstance(viewTypeMap[typeof(TView)]);
(IView)view.ShowDialog();
}
我得到一个错误:

仅限赋值、调用、递增、递减和新对象 表达式可以用作语句。”


IView定义ShowDialog()方法。

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

(A)B.C();
被解析为

(A)(B.C());
这不是一个法律声明。你应该写信

((A)B).C();
如果要将
B
转换为
A
,然后在键入
A
时调用
C()

为便于将来参考,优先表如下所示:

改变

(IView)view.ShowDialog();

((IView)视图).ShowDialog()


Eric解释了为什么可以在实例化时对其进行强制转换,如果多次使用,则无需每次都重新进行强制转换

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

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

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