c#泛型类型的隐式转换

时间:2015-03-27 10:28:37

标签: c# casting implicit-conversion

我试图理解泛型类型的隐式转换。 以下代码行不会编译:

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;错误,但我找不到任何关于它的信息。

有人可以向我解释一下这里发生了什么? 谢谢!

1 个答案:

答案 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