具有多个通用参数/约束的方差

时间:2019-01-12 04:50:52

标签: .net generics interface variance

首先,我什至不知道问题是否正确,因为我不确定问题到底是什么。将这些界面用于初学者:

public interface IItemContainer<TValue, TItem> where TItem : IItem<TValue>
{
    List<TItem> Items { get; set; }
}

public interface IItem<T>
{
    T Value { get; set; }
}

我是这样实现的:

public class ItemContainer1<TValue> : IItemContainer<TValue, Item1<TValue>>
{
    public List<Item1<TValue>> Items { get; set; }
}

public class Item1<T> : IItem<T>
{
    public T Value { get; set; }
}

到目前为止,一切正常,但是在以下作业中出现“无法隐式转换”强制转换错误:

IItemContainer<string, IItem<string>> container = new ItemContainer1<string>();

如果我尝试像这样投放,我会得到InvalidCastException

IItemContainer<string, IItem<string>> container =
    (IItemContainer<string, IItem<string>>)new ItemContainer1<string>();

某事告诉我我有通用参数或约束错误(或两者都有)。这可能是一个差异问题,我还没有完全解决。我需要做些什么才能使它起作用?

编辑:我不是TItem参数的忠实拥护者,但这是我知道的将List<TItem>属性设置为List<Item1<TValue>>而不是{{1 }}。

1 个答案:

答案 0 :(得分:1)

由于您希望列表的类型为Item1<TValue>,因此无法将其强制转换为较不具体的IItem<TValue>。类型为IItem<TValue>的属性的设置器对于接口的任何有效实现者均应成功。您要么需要允许您声明自己不想使用的IItem<TValue>类型的列表,要么以另一种方式重新构建。

如果您只需要以IItem<TValue>的形式读取列表值,而不是使用该界面来创建新列表,则可以更改界面以读取和转换这些值。