Передача 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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