Передача ICOLECTION в параметр, который ожидает обостренного [дублирования]C#

Место общения программистов C#
Anonymous
Передача ICOLECTION в параметр, который ожидает обостренного [дублирования]

Сообщение Anonymous »

Компилятор говорит мне, что я не могу передать Icollection параметр, который ожидает ienumerable , и я не могу выяснить, почему.
Во-первых, пример, который выполняет :

internal class Program {
static void Main(string[] args) {
ICollection myList = new List();

myList.Add("A");
myList.Add("B");
myList.Add("C");

MyMethod(myList);
}

private static void MyMethod(IEnumerable myList) {
foreach(string myItem in myList) {
Console.WriteLine(myItem);
}
}
}

Я объявляю свой объект как Icollection , а фактический объект-это список , и я могу передать его методу, который ожидает, что он не поддается . PrettyPrint-Override ">

Код: Выделить всё

internal class Program {
static void Main(string[] args) {
IDictionary myDictionary = new Dictionary();

myDictionary.Add("First", new List());
myDictionary["First"].Add("A");
myDictionary["First"].Add("B");
myDictionary["First"].Add("C");

myDictionary.Add("Second", new List());
myDictionary["Second"].Add("X");
myDictionary["Second"].Add("Y");
myDictionary["Second"].Add("Z");

MyMethod(myDictionary);
}

private static void MyMethod(IDictionary myDictionary) {
foreach (KeyValuePair keyValuePair in myDictionary) {
foreach (string item in keyValuePair.Value) {
Console.WriteLine(keyValuePair.Key);
Console.WriteLine(item);
}
}
}
}
Я объявил свой объект как Idictionary , а фактический объект - это словарь . Когда я создаю экземпляры ICollections в словаре, они просто список .
, и он не будет иметь его

Код: Выделить всё

Argument 1: cannot convert from 'System.Collections.Generic.IDictionary' to 'System.Collections.Generic.IDictionary'
< /code>
Если я изменяю метод на < /p>
private static void MyMethod(IDictionary myDictionary) {
foreach (KeyValuePair keyValuePair in myDictionary) {
foreach (string item in keyValuePair.Value) {
Console.WriteLine(keyValuePair.Key);
Console.WriteLine(item);
}
}
}
< /code>
Тогда он счастлив. Но почему? Icollection  
реализует ienumerable , так что он должен принять это, не так ли? Я объявил параметр как ienumerable , потому что все, что я хочу сделать с ним, - это итерация через них.


Подробнее здесь: https://stackoverflow.com/questions/797 ... enumerable

Вернуться в «C#»