c# -没有隐式引用转换
本文关键字:引用 转换 | 更新日期: 2023-09-27 18:18:08
我知道问题,但我找不到解决办法。我怎么能创造这样一个结构。正确的方法是什么?
public class BuildingListPageViewModel : ListPageViewModel<BuildingItemViewModel>
{
}
public interface ItemViewModel<T> where T:IEntity
{
T Model { get; set; }
}
public abstract class ListPageViewModel<TVm> : PageViewModel where TVm : ItemViewModel<IEntity>
{
}
public class BuildingItemViewModel : ItemViewModel<Building>
{
}
public partial class Building : IEntity
{
public int Id;
}
给出了BuildingItemViewModel
不能在泛型或方法ListPageViewModel<TVm>
中用作类型参数TVm
。不存在从BuildingItemViewModel
到ItemViewModel<IEntity>
的隐式引用转换错误。
在ListPageViewModel
上需要第二个通用参数:
public abstract class ListPageViewModel<TVm, TModel>
where TVm : ItemViewModel<TModel>
where TModel : IEntity
{
}
然后声明从ListPageViewModel
派生的类,同时指定TVm
和TModel
:
public class BuildingListPageViewModel
: ListPageViewModel<BuildingItemViewModel, Building>
{
}
您面临的问题是由于您将BuildingItemViewModel
创建为ItemViewModel<Building>
造成的。问题是,您想要接受ItemViewModel<IEntity>
,其中IEntity是一个接口,但是您的BuildingViewModel是用具体类型Building
定义的,而不是接口,因此违反了结构并给您一个错误。
ItemViewModel
需要协变。否则,ItemViewModel<Building>
不会是ItemViewModel<IEntity>
的子类型。
要使其协变,您需要将类型参数声明为out
参数,并从ItemViewModel中删除setter:
public interface ItemViewModel<out T> where T:IEntity
{
T Model { get; }
}
public class BuildingItemViewModel : ItemViewModel<Building>
{
Building b;
private BuildingItemViewModel(Building b) { this.b = b; }
public Building Model { get { return b; } }
}