【发布时间】:2016-05-11 13:04:55
【问题描述】:
我有一个通用函数,它返回AnyListVM 的子类的新实例,基本上是这样实现的:
public TListVM MakeListVM<TListVM>()
where TListVM : AnyListVM
{
TListVM listVM;
switch(typeof(TListVM).ToString())
{
case nameof(EventListVM):
listVM = new EventListVM();
// some more init stuff
break;
// some more similar cases
default:
throw new NotImplementedException();
}
return listVM;
}
这两个涉及的类目前看起来像这样,还没有任何有意义的实现:
public abstract class AnyListVM
{
}
public class EventListVM : AnyListVM
{
}
现在 Visual Studio 强调了我的 new EventListVM() 并唠叨它不能将 EventListVM 隐式转换为 TListVM。
好的,所以我想我只是添加一个显式演员:
listVM = (TListVM)new EventListVM();
但是没有。现在 Visual Studio 再次强调它并说它是一个多余的演员表。提供的自动修复将是再次删除演员表。无限循环。
这里出了什么问题,为什么不允许我显式或隐式地执行此转换?
【问题讨论】:
-
奇怪的是,如果我写
listVM = (TListVM)Activator.CreateInstance(typeof(TListVM));而不是listVM = new EventListVM();,它就不符合要求。为什么会这样? -
语句
listVM = (TListVM)Activator.CreateInstance(typeof(TListVM));没有对具体类型的引用,因此在这种情况下编译器不必尝试转换为EventListVM或从EventListVM转换。