2015-03-27 4 views
0

Я пытаюсь понять неявные отбрасывания родовых типов. Следующие строки кодов не скомпилируется:C# неявные отбрасывания родовых типов

class Dataset : Dictionary<string, string> 
{ 
} 

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

Однако, если добавить следующий оператор неявного к классу Секции они компилировать.

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

Что действительно меняют эти линии? (Кстати: ReSharper в настоящее время показывает «Конверсия в базовом классе» ошибка, но я не мог найти ничего об этом

Может кто-нибудь, пожалуйста, объясните мне, что здесь происходит ?? спасибо !!

+0

_ "не будет собирать" _ - почему нет? Поделитесь ошибками компилятора и покажите свои исследования. – CodeCaster

ответ

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 
Смежные вопросы