首先,我什至不知道问题是否正确,因为我不确定问题到底是什么。将这些界面用于初学者:
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 }}。
答案 0 :(得分:1)
由于您希望列表的类型为Item1<TValue>
,因此无法将其强制转换为较不具体的IItem<TValue>
。类型为IItem<TValue>
的属性的设置器对于接口的任何有效实现者均应成功。您要么需要允许您声明自己不想使用的IItem<TValue>
类型的列表,要么以另一种方式重新构建。
如果您只需要以IItem<TValue>
的形式读取列表值,而不是使用该界面来创建新列表,则可以更改界面以读取和转换这些值。