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。不存在从BuildingItemViewModelItemViewModel<IEntity>的隐式引用转换错误。

c# -没有隐式引用转换

ListPageViewModel上需要第二个通用参数:

public abstract class ListPageViewModel<TVm, TModel>
    where TVm : ItemViewModel<TModel>
    where TModel : IEntity
{
}

然后声明从ListPageViewModel派生的类,同时指定TVmTModel:

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; } }
}