Инициализировать неявно типизированную локальную переменную в IList

#c# #implicit-typing

#c# #неявный ввод

Вопрос:

Я это понимаю implicitly-typed local variables must be initialized .

Я знаю, что это result будет IList , так могу ли я как-то сказать, что var result будет IList ?

 var resu< //initialize to something 

if( x < 0)  
{  
    result = (from s in context.someEntity  
              where s.somecolumn = x  
              select new { c1 = s.c1,c2=s.c2}).ToList();  
}

if(x >= 0)  
{  
    result = (from s in context.someEntity  
              where s.someOtherColumn = x  
              select new { c1 = s.c1,c2=s.c2}).ToList();  
}

foreach(var y in result)  
{  
    //do something . UPDATE 1: Retrieve y.c1, y.c2

}  
  

Ответ №1:

Нет, они не могут быть «var может использоваться только тогда, когда локальная переменная объявлена и инициализирована в том же операторе; переменная не может быть инициализирована значением null, или группой методов, или анонимной функцией».

Поскольку вы не инициализируете интерфейс, это не сработает.

http://msdn.microsoft.com/en-us/library/bb384061.aspx

Ответ №2:

Если вы знаете, что хотите, чтобы это было IList , почему бы просто не объявить это как IList ?

Использование var для неинициализированных переменных (IMO) довольно нечитаемо.

Комментарии:

1. Обычно я с вами согласен, но я видел, как некоторые люди используют это, чтобы при изменении имени типа (например, с Human на Person) им не нужно было изменять объявление. Хотя с большинством инструментов рефакторинга это бессмысленно

Ответ №3:

Сделайте это:

 var result = default(IList);
  

Ответ №4:

Возможно, вам удастся что-то сделать с помощью троичной операции:

 var list = (x < 0) ? ... : ...
  

но на самом деле, это было бы довольно болезненно читать. С вашим опубликованным кодом, я думаю, я бы просто придерживался

 IList resu<
  

для удобства чтения.

Ответ №5:

Если вы используете System.Коллекции.Общий в вашем коде, тогда единственным доступным вариантом является

var list = (x < 0) ? … : …

Если вы попытаетесь использовать IList в приведенном выше сценарии, вы получите сообщение об ошибке Не удается неявно преобразовать тип ‘System.Коллекции.Общий.IEnumerable’ to’System.Коллекции.IList’. Существует явное преобразование (вам не хватает приведения?)

Но если вы используете System.Коллекции, которые вы можете использовать

Результат IList;