4 votes

Erreur CS0649 en C#

Il y a un bug dans le code que je n'arrive pas à trouver, certaines variables ne fonctionnent pas d'une manière ou d'une autre.

L'avertissement que je reçois :

CS0649 Le champ "Calculs.A" n'est jamais attribué et aura toujours sa valeur par défaut 0 ABC-Formule [path]. \Calculations.cs

CS0649 Le champ "Calculs.B" n'est jamais attribué et aura toujours sa valeur par défaut 0 ABC-Formule [path]. \Calculations.cs

CS0649 Le champ "Calculs.C" n'est jamais attribué et aura toujours sa valeur par défaut 0 ABC-Formule [path]. \Calculations.cs

Code : Programme.cs

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

namespace ABC_Formule
{
    class Program
    {
        static void Main(string[] args)
        {
            bool keepGoing = true;
            while (keepGoing)
            {
                //Definieren strings gebruikt in Main
                string a;
                string b;
                string c;
                string keepGoingString;
                string discriminantString;

                double aDouble;
                double bDouble;
                double cDouble;

                double discriminantValue;
                double singleX;
                double doubleX1;
                double doubleX2;

                //Vraag de user om input
                Console.WriteLine("Welkom bij de ABC-Calculator. Gemaakt door Luciano Nooijen.");
                Console.WriteLine("Zorg voor een correcte invoer. De opbouw van een formule is ax^2 + bx + c.");
                Console.WriteLine("");
                Console.WriteLine("Vul de juiste variabelen in: (komma = ,)");
                Console.Write("a: "); a = Console.ReadLine();
                Console.Write("b: "); b = Console.ReadLine();
                Console.Write("b: "); c = Console.ReadLine();

                //Omzetten van string naar double 
                aDouble = Convert.ToDouble(a);
                bDouble = Convert.ToDouble(b);
                cDouble = Convert.ToDouble(c);

                Console.WriteLine("a, b en c zijn: " + aDouble + ", " + bDouble + " en " + cDouble);
                Console.WriteLine("");

                //Invoeren getallen in berekenfunctie
                Calculations berekeningen = new Calculations(aDouble, bDouble, cDouble);

                //Discriminant berekenen
                discriminantValue = berekeningen.Discriminant();

                //Validatie discriminant en output
                discriminantString = berekeningen.ValidDiscriminant();
                if (discriminantString == "Gelijk") //Enkele output 
                {
                    singleX = berekeningen.OutputOnlyX();
                    Console.WriteLine("De discriminant is: " + discriminantValue);
                    Console.WriteLine("Het x-coördinaat is: " + singleX);
                }
                else if (discriminantString == "Groter") //Dubbele output
                {
                    doubleX1 = berekeningen.OutputX1();
                    doubleX2= berekeningen.OutputX2();
                    Console.WriteLine("De discriminant is: " + discriminantValue);
                    Console.WriteLine("Het x1-coördinaat is: " + doubleX1);
                    Console.WriteLine("Het x2-coördinaat is: " + doubleX2);
                }
                else if (discriminantString == "Kleiner") //Geen snijpunt
                {
                    Console.WriteLine("De discriminant is: " + discriminantValue + " en er is dus geen snijpunt met de x-as.");
                }
                else //Ongeldige invoer
                {
                    Console.WriteLine("Ongeldige invoer");
                }

                //Vragen of gebruiker door wil gaan
                Console.Write("Druk op enter om door te gaan, of druk op typ q om af te sluiten: "); keepGoingString = Console.ReadLine();
                if (keepGoingString.Equals("q"))
                {
                    keepGoing = false;
                }
                else
                {
                    Console.WriteLine("");
                    Console.WriteLine("-----------------------------------------------------------");
                    Console.WriteLine("");
                    Console.Clear();
                }              
            }

        }
    }
}

Calculs.cs

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

namespace ABC_Formule
{
    class Calculations
    {
        protected double A;
        protected double B;
        protected double C;
        protected double DiscriminantValue;

        public Calculations (double a, double b, double c)
        {
            double A = a;
            double B = b;
            double C = c;
        }

        public double Discriminant ()
        {
            DiscriminantValue = B*B-4*A*C;
            return DiscriminantValue;
        }

        public string ValidDiscriminant()
        {
            if (DiscriminantValue < 0) //Geen uitkomst
            {
                return "Kleiner";
            }
            else if (DiscriminantValue == 0) //1 uitkomst
            {
                return "Gelijk";
            }
            else if (DiscriminantValue > 0) //Twee uitkomsten
            {
                return "Groter";
            }
            else //Bij fout
            {
                return "Error";
            }

        }

        public double OutputOnlyX ()
        {
            return (-B + Math.Sqrt(DiscriminantValue) ) / (2 * A);
        }

        public double OutputX1 ()
        {
            return (-B - Math.Sqrt(DiscriminantValue)) / (2 * A);
        }

        public double OutputX2 ()
        {
            return (-B + Math.Sqrt(DiscriminantValue)) / (2 * A);
        }
    }
}

4voto

BartoszKP Points 14131

En Calculations que vous avez :

double A = a;

vous voulez :

A = a; // or this.A = a;

au lieu de (cela concerne bien sûr aussi les B y C ) .

Dans votre code, vous créez une variable locale (dans la portée du constructeur) A qui n'a rien à voir avec les objectifs de la classe. A (en plus de porter le même nom, ce qui peut prêter à confusion). Ce qui se passe dans une telle situation est appelé l'ombre , ce qui a pour effet d'entraîner tous les A dans le code de cette fonction pour désigner la variable locale, et non le champ dans la portée parentale.

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