2016-09-21 1 views
2

Я пытаюсь понять, почему компилятор выдает ошибку, когда я пытаюсь использовать специальный метод «Список» «Добавить» в этом контексте. В объяснении ошибки указано, что это связано с определением поля. (IEnumerable не включает метод «Добавить»). Однако я ввел его во внутренний контекст. Буду благодарен за разумное объяснение.Экземпляр экземпляра не распознается в контексте метода в C#

Примечание: Я знаю, что это потому, что IEnumerable является интерфейсом, и вместо этого я могу использовать IList. Однако я не мог понять, что компилятор должен извлекать тип во внутреннем контексте, но его нет.

class Program 
{ 
    private static IEnumerable<string> exampleList; 
    public static void Main() 
    { 
     exampleList = new List<string>(); 
     exampleList.Add("ex"); // ==> Compiler Error Here. 
    } 
} 
+0

Данное сообщение об ошибке является конкретным и объясняет проблему. 'IEnumerable ' не имеет метода «Добавить». Вы хотели объявить 'exampleList' как' List ' вместо этого? –

+1

Вот что такое инкапсуляция в ООП. – Lou

+1

Я не понял, почему компилятор не извлекает этот тип во внутреннем контексте, но теперь я понял, что это потому, что новая операция выполняется во время выполнения, поэтому компилятор выдает ошибку, спасибо. – skynyrd

ответ

0

Изменить код, как указано ниже, поможет решить эту проблему.

private static List<string> exampleList; 

или изменить свой код в статический Main, как показано ниже

var newCollection = exampleList.ToList(); 
newCollection.Add("ex"); //is your new collection with the item added 
3

Ваш exampleList определяется как IEnumerable<string>, поэтому его время компиляции типа является IEnumerable<string>. Поэтому, когда компилятор компилирует код, он может только знать, что это IEnumerable<string>. существуют

Две основные исправления:

1) Объявляет exampleList как IList

private static IList<string> exampleList; 

2) Используйте временную переменную, чтобы установить содержание списка.

public static void Main() 
{ 
    var list = new List<string>(); 
    list.Add("ex"); 
    exampleList = list; 
} 

Просто кратко объяснить, почему компилятор может только знать, что это IEnumerable, рассмотрим следующий код:

IEnumerable<string> exampleList; 

if (TodayIsAWednesday()) 
{ 
    exampleList = new List<string>(); 
} 
else 
{ 
    exampleList = new string[0]; 
} 

// How can the compiler know that exampleList is a List<string>? 
// It can't! 
exampleList.Add("ex"); 
+0

Упрощенный, я просто думал о добавлении ответа с чем-то похожим на последний фрагмент. – Lou

+0

Спасибо, но я не мог понять, что компилятор должен извлекать тип во внутреннем контексте, но его нет. Я уже решил это, используя IList вместо IEnumerable. – skynyrd

+1

@skynyrd просто поставил: Это не так, как это работает. Если ваша переменная определена для определенного типа, она может использовать только методы этого конкретного типа. –