fråga om C#, mitt program fungerar när den körs men "debug" protesterar. (nybörjare)
Fråga från nybörjare:
Jag klistrar in min kod sist i frågan. Det fungerar så att det det jag skriver i .... konsollen(? osäker på termerna, ny på detta) ska användas i svaret.
När jag kör koden så funkar den fint men om jag gör "Debug" så får jag följande felmeddelande på rad 8 och 10:
"converting null lieral or possible null value to non-nullble type. (CS8600)
är något fel och i så fall vad?
namespace Uppg2._1;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Vad heter du?");
string namn = Console.ReadLine();
Console.WriteLine("Vilket är ditt dromresmal?");
string mal = Console.ReadLine();
Console.WriteLine("Hej " + namn + " Jag hoppas du far aka till " + mal);
Console.ReadLine();
}
}
Samma fel i nästa uppgift, där kommer felmeddelandet på rad 9 och 10, men bara när jag kör Debug. Det går bra att köra koden?
Så här ser min kod ut. Den ska ge mig svar på frågan om årtal om 20 år, givet att jag ger den det aktuella årtalet. Och det gör den.
namespace Uppg2._2Bok;
class Program
{
static void Main(string[] args)
{
{
Console.WriteLine("Vilket artal ar det");
string artalText = Console.ReadLine();
int artal = int.Parse(artalText);
int artalOm20 = artal + 20;
Console.WriteLine("Om 20 ar ar det " + artalOm20);
Console.ReadLine();
}
}
}
Felmeddelanden kan vara krångliga att förstå i början, men dom är för det mesta väldigt logiska (vilket iofs kan vara anledningen till att de är krångliga...). Kämpa på!
null
i C# är ett värde som är just ingenting. Inte att förväxla med 0, som ju faktiskt är ett tal. Ett exempel på när null
är använbart att ha är just med funktionen Console.ReadLine()
. Om funktionen inte kan få tag på nästa 'line' returnerar den null
för att visa detta.
Om vi tittar på felmeddelandet igen så säger den i princip att "du försöker ge värdet null
till en variabel som inte kan vara null
". Datatypen string
kan alltså inte vara null
.
Nu har inte jag så mycket erfarenhet alls med C#, men min gissning är att när du kör i Debug-läget så kan ingen input tas, och Console.ReadLine()
kommer returnera null
. Det är alltså inget att bry sig om så länge du får rätt output när du kör som vanligt.
Konsollen är rätt term förresten. Eller terminalen som den också kallas.
Kan också tillägga att Debug-läget eventuellt kan bete sig annorlunda beroende på vilken kompilator, IDE och dator du använder.
Problemet ligger i att readline kan returnera null om användare i konsolen kör ctrl+z, därför får du en varning av din kompilator.
Du kan ignorera de för tillfället.
Prova annars:
if(!string.IsNullOrEmpty(input))
{
// gör ngt
}
Man tycker ju att det ska gå att debugga programmet, alltså köra det samtidigt som man får se vad det gör, precis som man tänker köra programmet på riktigt. Finns det kanske nånstans att skriva in input i debug-läget som du inte har upptäckt?
Ja, det låter lite tveksamt att man inte kan mata in input medan man debuggar.
Dracaena skrev:Problemet ligger i att readline kan returnera null om användare i konsolen kör ctrl+z, därför får du en varning av din kompilator.
Du kan ignorera de för tillfället.
Prova annars:
if(!string.IsNullOrEmpty(input))
{
// gör ngt
}
nice har precis börjat med if-satser :) nice
tack för alla svar! Nu har plötsligt Debug slutat klaga? ej ändrat koden dock...
Men: nej jag kan inte mata in input under Debug, det kommer inte upp någon konsoll att skriva i. Den dyker bara upp när jag trycker på play.
Jag har Visual Sudio för Mac om det spelar någon roll.
Är du säker på att du har steppat fram till en readline? Prova steppa och se om inte din debugger sedan stannar upp. Om så är fallet väntar den på input.
Jag drog en snabb sökning då jag inte använder mac och hittade följande SO tråd:
Prova och se om det fungerar. Jag brukar inte sitta i C#, så någon annan kanske har bättre koll.
EDIT: Tråden handlade förviso om vsc, vilket SaraDK inte sa att hen använde! :)
Nu har jag inte hållit på med C# utan snarare mer bekant med Java / Kotlin, men av att läsa dokumentation så verkar string inte vara nullable by default. Alltså, en stringvariabel kan inte hålla ett null-värde om du inte säger att den ska kunna det, medan Console.ReadLine() potentiellt kan returnera null.
Du borde kunna säga att din variabel ska kunna ta emot null genom att lägga till ett frågetecken:
string? mal = Console.ReadLine();
Då vill man nog gärna också egentligen kolla ifall variabeln blir null och hantera det fallet.
Med reservation som sagt för att jag inte är van vid språket så kan vara värt att dubbelkolla