我试图理解泛型类型的隐式转换。 以下代码行不会编译:
class Dataset : Dictionary<string, string>
{
}
class Section : List<Dataset>
{
public List<Dictionary<string, string>> ToBase()
{
return this;
}
}
但是,如果我将以下隐式运算符添加到他们编译的Section类中。
public static implicit operator List<Dictionary<string, string>>(Section section)
{
return section;
}
这些线条真正改变了什么? (顺便说一句:ReSharper现在显示&#34;转换为基类&#34;错误,但我找不到任何关于它的信息。
有人可以向我解释一下这里发生了什么? 谢谢!
答案 0 :(得分:1)
您无法将List<Dataset>
投射到List<Dictionary<string, string>>
,因为List<T>
不具有协变性(并且只有C#中的界面可以协变,因此您需要一个IList<T>
,但IList<T>
不是协变的)
请注意:
public IEnumerable<Dictionary<string, string>> ToBase()
{
return this;
}
是合法的,因为IEnumerable<>
是协变的,因此您可以将IEnumerable<subclass>
投射到IEnumerable<baseclass>
举一些例子:
Section section = new Section();
List<Dataset> sectionAsList = section; // Legal
List<Dictionary<string, string>> sectionAsListDictionary = section; // Illegal
IList<Dictionary<string, string>> sectionAsIListDictionary = section; // Illegal
IEnumerable<Dictionary<string, string>> sectionAsIEnumerableDictionary = section; // Legal