2015-07-01 1 views
2

У меня есть оператор if-else, который получает результаты поиска из базы данных с использованием Linq, каждый из которых отличается от другого, но возвращаемый тип, если тот же.Определить var за пределами области использования if-else для последующего использования

Моя проблема в том, что я не могу инициализировать переменную var вне инструкции if-else. Мне это нужно, потому что после утверждения я продолжаю запрашивать результаты.

результат: iQueryable<mission>;

Как я могу заставить var в области функций принимать результаты?

Я попытался инициализировать его Enumerable.Empty<mission>().AsQueryable(), и он не сработал, попробовал использовать переменную dynamic и установил также var missions = null, и это тоже не сработало.

+1

Можете ли вы показать код и ошибки, которые вы получаете? – juharr

+1

Что случилось с 'IQueryable = null;'? – haim770

+0

Затем измените var на правильный тип и назначьте его wil null или значение по умолчанию – Mivaweb

ответ

5

Итак ... не использовать var?

IQueryable<Mission> variable; 

if (...) 
{ 
    ... 

Кроме того, в качестве альтернативы var variable = null (который не компилируется), вы можете использовать default:

var variable = default(IQueryable<Mission>); 

В отличие от кода выше, хотя, это будет скрывать ошибки, вытекающие из «забывая» для назначения переменной - вы назначаете «типизированный» null, поэтому переменная имеет назначенное значение. В первом примере variable не присвоен, поэтому, если есть какая-либо ветка вашего кода, которая пытается прочитать значение variableбез, записывая сначала, компилятор сообщит об ошибке. Также обратите внимание, что default возвращает null для ссылочных типов. Типы значений будут в основном возвращать нулевые средства для этого конкретного типа - например, default(int) просто равен нулю, а default(DateTime) - 01/01/0001 00:00:00 (DateTime.MinValue).

+0

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

+0

Спасибо за дополнение, многому научившись сегодня. –

4

компилятор должен быть в состоянии определить фактического типа var переменной во время компиляции. Если вы сделаете это:

var foo = null; 

Или это:

var foo; 

Что тип foo? Вы не можете сказать, и компилятор тоже не может.

Так что, если вам нужно иметь набор переменных для null, вы должны сказать компилятору, какой тип это:

IQueryable<Mission> foo = null; 

Или, если вы не хотите, чтобы инициализировать его еще:

IQueryable<Mission> foo; 

Посмотрите на ссылку MSDN на неявные типизированные локальные переменные.В частности:

Ключевое слово var дает указание компилятору вывести тип переменной из выражения в правой части инструкции инициализации.

Вы не можете вывести тип из null, и вы, конечно, не может это сделать, если нет никакого выражения на правой стороне.

также:

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

Смежные вопросы