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
我正在尝试了解泛型类型的隐式转换。 以下代码行无法编译:
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