2010-11-18 7 views
0

je page ASPX sur laquelle j'ai quelque chose comme ça:exception étrange dans la page .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> 
<% } %> 

Alors ma question est pourquoi je reçois l'exception? Si j'écris string image = ""; cette exception disparaît. C'est très étrange. Je suppose que l'exception a quelque chose à voir avec la présentation de la page ASPX. Quelqu'un peut-il expliquer pourquoi cela arrive?

+0

Si vous voulez vraiment savoir comment votre page est compilée, vous pouvez configurer MVC pour compiler la vue lors de la construction. Il peut être très instructif de voir les erreurs dans un contexte plus familier: http://stackoverflow.com/questions/383192/compile-views-in-asp-net-mvc – spender

Répondre

1

Si vous êtes après la raison plutôt que la solution (que vous connaissez déjà) - lorsque vous déclarer une variable rien ne se passe. Ce n'est que lorsque vous affectez quelque chose que le compilateur va réserver de l'espace mémoire et tout.

Donc essayer d'accéder à une variable qui n'est pas encore initialisée n'est pas valide car il n'y a nulle part dans la mémoire de la machine où aller ... il n'y a rien encore. C'est comme essayer de soulever un seau qui n'est pas là: ce n'est pas un seau vide .. ce n'est pas un seau plein ... il n'y a pas de seau à soulever.

+0

Merci pour les détails, je ne peux pas trouver beaucoup d'informations sur la façon dont fonctionne le compilateur C# – devfreak

8

Lorsque vous déclarez votre variable image, attribuez-lui une valeur initiale.

string image = ""; 

L'erreur que vous obtenez indique que la variable n'a pas été initialisé dans tous les cas (il ne s'initialisé si cond est vrai).

Ceci n'a rien à voir avec être contenu dans une page .aspx. Vous obtiendrez la même erreur dans un code derrière.

+0

Merci. Je viens de la terre C++, là vous avez un contrôle total sur ce personnel, je suppose que je dois m'habituer à toutes les limitations dans C#. – devfreak

+3

Beaucoup des avantages du «contrôle total» signifient simplement que vous pouvez vous tirer dans le pied avec un viseur télescopique. Ce n'est pas une limitation ... le compilateur vous fait une grande faveur ici. – spender

+1

+1 pour dépenser. Le compilateur vous aide à ne pas commettre d'erreurs stupides. Ce que vous appelez la limitation, j'appelle l'automatisation des tâches banales. – Chev

1

Ou mieux encore serait d'ajouter un autre à votre cas pour définir la valeur par défaut:

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

Oui c'est un peu mieux, parce que de cette façon nous avons une affectation de moins. Merci – devfreak

+0

@devfreak Vous pouvez avoir 0 affectations en faisant le côté serveur d'image puis en définissant sa source directement: if (cond) Image1.Src = "somestring"; sinon Image1.Src = "somethingelse"; –