#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, или группой методов, или анонимной функцией».
Поскольку вы не инициализируете интерфейс, это не сработает.
Ответ №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;