2010-12-15 108 views
0

vraie question débutant, mais pourquoi cela ne fonctionne pas? Je reçoisPourquoi ce code C# génère-t-il une erreur?

utilisation de « comparaison » variables non affecté

comme l'erreur

 string comparison; 
     Console.WriteLine("Enter the first number"); 
     int firstNum = Convert.ToInt32(Console.ReadLine()); 
     Console.WriteLine("Enter the second number"); 
     int secondNum = Convert.ToInt32(Console.ReadLine()); 
     if (firstNum == secondNum) 
      comparison = "equals to"; 
     if (firstNum < secondNum) 
      comparison = "less than"; 
     if (firstNum > secondNum) 
      comparison = "greater than"; 
     Console.WriteLine("{0}",comparison); 
+0

Pour quiconque possède le 2001 Beginning C# de Wrox, vous pouvez voir cette solution alternative à la page 66. – super9

Répondre

5

Il est presque auto explicatif - on ne peut pas garantir que la comparaison est affectée (avoir une valeur) et le compilateur envoie une erreur à la suite de cela. Fondamentalement, vos instructions if peuvent ne jamais définir une valeur à 'comparaison' et c'est pourquoi il échoue.

Un moyen rapide et sale tour serait de déclarer la comparaison d'une manière similaire à ce

string comparison = "unassigned";

ou

string comparison = String.Empty;

+0

Donc, d'une certaine manière, le compilateur est en train d'anticiper le problème et de relancer une erreur à l'avance? Parce que la logique mathématique garantit que la comparaison sera toujours affectée d'une valeur – super9

+0

Dans un sens - oui. Si vous êtes vraiment intéressé, les liens que Daniel a fournis l'expliqueront mieux et plus en profondeur que je peux: -] – Lee

+0

pourquoi votre solution est-elle une méthode rapide et sale? semble être la méthode «correcte» non? – super9

12

Parce que le compilateur ne sait pas comparison était dans un chemin exécutable. Changer les trois ifs à if-then-elses:

if (firstNum == secondNum) 
     comparison = "equals to"; 
    else if (firstNum < secondNum) 
     comparison = "less than"; 
    else 
     comparison = "greater than"; 

et il travaillera

0

Vous pouvez définir par rapport à string.Empty aussi bien quand vous déclarez ...

1

Les autres réponses ici sont corrects. Le problème est que C# requires toutes les variables à definitely assigned avant d'être utilisées.

0

Le problème de base ici est que le compilateur ne vérifie pas une série de conditions comme celle-ci pour voir qu'elles combinent toutes les options possibles. Tout ce qui est conditionnel est considéré comme pouvant être exécuté et c'est ça, il ne regarde jamais la situation dans son ensemble. Comme l'a dit Jesse, faites-en un seul sinon sinon sinon le compilateur peut voir qu'il n'y a pas d'autres chemins. C'est quand même un peu plus efficace car votre code exécute toujours les trois tests alors que son code exécute au plus deux tests.