c#泛型类型的隐式转换

c# implicit casts of generic types

我正在尝试了解泛型类型的隐式转换。 以下代码行无法编译:

class Dataset : Dictionary<string, string>
{
}

class Section : List<Dataset>
{
    public List<Dictionary<string, string>> ToBase()
    {
        return this;
    }
}

但是,如果我将以下隐式运算符添加到 class 部分,它们会编译。

public static implicit operator List<Dictionary<string, string>>(Section section)
{
    return section;
}

这些行真正改变了什么? (顺便说一句:ReSharper 现在显示 "Conversion to base class" 错误,但我找不到任何相关信息。

谁能给我解释一下这是怎么回事?? 谢谢!!

您不能将 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