45 votes

Que signifie "Utilisation d'une variable locale non attribuée" ?

Je continue à obtenir cette erreur pour annualRate, monthlyCharge, et lateFee.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Lab_5___Danny_Curro
{
    class Program
    {
        static void Main(string[] args)
        {
            string firstName;
            string lastName;
            int accNumber;
            string creditPlan;
            double balance;
            string status;
            Boolean late = false;
            double lateFee;
            double monthlyCharge;
            double annualRate;
            double netBalance;

            Console.Write("Enter First Name: ");
            firstName = Console.ReadLine();

            Console.Write("Enter Last Name: ");
            lastName = Console.ReadLine();

            Console.Write("Enter Account Number: ");
            accNumber = Convert.ToInt32(Console.ReadLine());

            Console.Write("Enter Credit Card Plan Number[Blank Will Enter Plan 0]: ");
            creditPlan = Console.ReadLine();

            Console.Write("Enter Balance: ");
            balance = Convert.ToDouble(Console.ReadLine());

            Console.Write("Is This Account Late?: ");
            status = Console.ReadLine().Trim().ToLower();

            if (creditPlan == "0")
            {
                annualRate = 0.35;  //35%
                lateFee = 0.0;
                monthlyCharge = balance * (annualRate * (1 / 12));
                return;
            }

            if (creditPlan == "1")
            {
                annualRate = 0.30;  //30%
                if (status == "y")
                {
                    late = true;
                }

                else if (status == "n")
                {
                    late = false;
                }
                if (late == true)
                {
                    lateFee = 25.00;
                }
                monthlyCharge = balance * (annualRate * (1 / 12));
                return;
            }
            if (creditPlan == "2")
            {
                annualRate = 0.20;  //20%
                if (status == "y")
                {
                    late = true;
                }

                else if (status == "n")
                {
                    late = false;
                }
                if (late == true)
                {
                    lateFee = 35.00;
                }
                if (balance > 100)
                {
                    monthlyCharge = balance * (annualRate * (1 / 12));
                }
                else
                {
                    monthlyCharge = 0;
                }
                return;
            }
            if (creditPlan == "3")
            {
                annualRate = 0.15;  //15%
                lateFee = 0.00;

                if (balance > 500)
                {
                    monthlyCharge = (balance - 500) * (annualRate * (1 / 12));
                }
                else
                {
                    monthlyCharge = 0;
                }
                return;
            }
            netBalance = balance - (lateFee + monthlyCharge);

            Console.WriteLine("Name: \t\t\t {0}  {1}", firstName, lastName);
            Console.WriteLine("Account Number: \t{0}", accNumber);
            Console.WriteLine("Credit Plane: \t\t{0}",creditPlan);
            Console.WriteLine("Account Late: \t\t{0}", late);
            Console.WriteLine("Balance: \t\t{0}", balance);
            Console.WriteLine("Late Fee: \t\t{0}", lateFee);
            Console.WriteLine("Interest Charge: \t{0}", monthlyCharge);
            Console.WriteLine("Net Balance: \t\t{0}",netBalance);
            Console.WriteLine("Annual Rate: \t\t{0}", annualRate);
            Console.ReadKey();
        }
    }
}

3 votes

Je ne suggère pas de remplacer if-else déclarations de deux if . Ce n'est pas la meilleure façon de procéder. Avez-vous pensé à ce qui se passe si vous changez la valeur de creditPlan à l'intérieur d'un if déclaration ? Ou si vous appelez une fonction qui le modifie (pour qu'il ne soit pas aussi évident ) ? L'exécution pourrait alors entrer dans le prochain if et ce n'est pas ce que tu voulais dire.

0 votes

J'ai refait les instructions if avant de rendre ce programme. Je vous remercie pour votre aide, je n'y aurais pas pensé.

0 votes

Un billet en rapport aquí en fournissant des détails intéressants dans le fil de réponse.

67voto

Jacob Points 33729

Le compilateur n'est pas assez intelligent pour savoir qu'au moins une de vos if seront exécutés. Par conséquent, il ne voit pas que les variables comme annualRate sera attribué quoi qu'il arrive. Voici comment vous pouvez faire comprendre au compilateur :

if (creditPlan == "0")
{
    // ...
}
else if (creditPlan == "1")
{
    // ...
}
else if (creditPlan == "2")
{
    // ...
}
else
{
    // ...
}

Le compilateur sait qu'avec un bloc if/else, l'exécution d'un des blocs est garantie, et donc si vous assignez la variable dans tous les blocs, le compilateur n'aura pas d'erreur.

À propos, vous pouvez également utiliser un switch au lieu de if pour rendre votre code plus propre.

20voto

Kyle Trauberman Points 16049

Modifiez vos déclarations comme suit :

double lateFee = 0.0;
double monthlyCharge = 0.0;
double annualRate = 0.0;

L'erreur est due au fait qu'il y a au moins un chemin dans votre code où ces variables finissent par ne rien recevoir.

12voto

Pete Points 4035

Parce que si aucune des instructions if n'est évaluée comme vraie, la variable locale ne sera pas affectée. Ajoutez une instruction else et attribuez des valeurs à ces variables au cas où les instructions if ne seraient pas évaluées à true. Revenez ici si l'erreur ne disparaît pas.

L'autre option consiste à initialiser les variables à une valeur par défaut lorsque vous les déclarez au début de votre code.

10voto

manojlds Points 96599

Donnez-leur une valeur par défaut :

double lateFee=0.0;
double monthlyCharge = 0.0;
double annualRate = 0.0;

En fait, tous les chemins possibles n'initialisent pas ces variables.

8voto

Daniel Points 41

Utilisez le mot clé "défaut" ! !!

    string myString = default;
    double myDouble = default;

    if(!String.IsNullOrEmpty(myString))
       myDouble = 1.5;

    return myDouble;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X