2010-11-18 5 views
0

У меня есть ASPX страница, на которой у меня есть что-то вроде этого:странное исключение в .aspx страницы

<% 
    string image; 
    if(cond) 
     image = "somestring"; 
%> 

... 

<% if (cond) { %> 
    <img src="<%= image %>" /> <!-- HereI get CS0165 exception: Use of unassigned local variable 'image' --> 
<% } else { %> 
    <div> ... </div> 
<% } %> 

Так что мой вопрос, почему я получаю исключение? Если я напишу string image = "";, это исключение исчезнет. Это очень странно. Я предполагаю, что это исключение связано с представлением страницы aspx. Может кто-нибудь объяснить, почему это происходит?

+0

Если вы действительно хотите узнать, как скомпилирована ваша страница, вы можете настроить MVC для компиляции представления при его создании. Это может быть очень полезно, чтобы увидеть ошибки в более знакомом контексте: http://stackoverflow.com/questions/383192/compile-views-in-asp-net-mvc – spender

ответ

1

Если вы после этого причины, а не решения (что вы уже знаете) - когда ты объявить переменную, ничего не происходит. Только когда вы назначаете что-то, компилятор зарезервирует пространство памяти и все такое.

Так что попытка доступа к переменной, которая еще не инициализирована, недействительна, потому что в памяти машины нет нигде ... нет ничего.

Это похоже на попытку поднять ведро, которого нет: это не пустое ведро .. это не полный ведро .. нет ведра для подъема.

+0

Спасибо за подробности, я не могу найти много информации о том, как работает компилятор C# – devfreak

8

Когда вы объявляете свою переменную image, дайте ей начальное значение.

string image = ""; 

Ошибка вы получаете указывает, что переменная не инициализирована во всех случаях (это только инициализируется, если cond верно).

Это не имеет никакого отношения к содержанию на странице .aspx. Вы получите ту же ошибку в коде.

+0

Спасибо. Я прихожу с земли C++, там у вас есть полный контроль над этим персоналом, я думаю, мне нужно привыкнуть ко всем ограничениям в C#. – devfreak

+3

Многие из преимуществ «полного контроля» просто означают, что вы можете стрелять в ногу телескопическим прицелом. Это не ограничение ... компилятор делает вам большую услугу здесь. – spender

+1

+1 для спрединга. Компилятор помогает вам не совершать глупых ошибок. То, что вы называете ограничением, я называю автоматизацией мирских задач. – Chev

1

Или еще лучше было бы добавить еще к вашему, если установить значение по умолчанию:

string image; 
if(cond) 
    image = "somestring"; 
else 
    image = String.Empty; 
+0

Да, это немного лучше, потому что у нас есть одно меньшее назначение. Спасибо – devfreak

+0

@devfreak У вас может быть 0 назначений, создав сервер изображения, а затем установите его источник напрямую: if (cond) Image1.Src = "somestring"; else Image1.Src = "somethingelse"; –