Vezérlőpult
B6. Konverziók · Változók és típusok

B blokk · Változók és típusok · 6. tananyag

Konverziók: cast, Parse, TryParse, Convert

A típusok között falak vannak — de az adat vándorol: a felhasználó szöveget gépel, nekünk szám kell belőle. A konverzió a kapu ezekben a falakban. A fejezet végére az is kiderül, miért ír a "42" + 2 422-t — és hogyan lesz belőle mégis 44.

2 tanóraA char-rejtély beváltása

Tanulási célok

1A konverziós térkép

Mielőtt a részletekbe megyünk, nézd a nagy képet:

string "42" SZÖVEG double long int short byte implicit kicsi → nagy, automatikus cast (típus) — nagy → kicsi, veszteség lehet Parse / TryParse ToString() / $"…" A decimal is a torony lakója: int → decimal implicit, double → decimal már cast.
A négy irány: implicit felfelé, cast lefelé, Parse/TryParse befelé — a kifelé utat (ToString, interpoláció) már ismered.

Szám → szöveg irányba már profi vagy (B4 interpoláció, B5 ToString). A másik három irány a mai anyag.

2Implicit konverzió — amikor nincs mit félteni

A fordító magától átkonvertál, ha a célt garantáltan nem érheti veszteség — vagyis kisebb típusból nagyobba:

int pont = 87;
long nagyPont = pont;        // int → long: mindig belefér
double atlag = pont;         // int → double: 87-ből 87.0
decimal ar = pont;           // int → decimal: pénzszámításba is beléphet

Ez történt a B3-ban a 7 / 2.0-nál is: az egész 7 magától lépett elő double-lé. A szabály egyszerű: felfelé (bővebb típusba) szabad az út.

3Explicit konverzió (cast) — amikor te vállalod a kockázatot

Visszafelé — nagyobból kisebbe — a fordító nem megy magától, mert adat veszhet el. Ha mégis kell, neked kell kimondanod a cast-tal: (céltípus)érték.

double meres = 3.9;
int egesz = (int)meres;
Console.WriteLine(egesz);        // 3  — LEVÁGJA a törtrészt, nem kerekít!

int nagy = 300;
byte kicsi = (byte)nagy;
Console.WriteLine(kicsi);        // 44 — körbefordult! (300 − 256)

Két dolgot véss be:

  1. A cast levág, nem kerekít: (int)3.9 → 3, (int)-3.9 → −3. (Ha kerekíteni akarsz, arra a Math.Round való — az I. blokk témája.)
  2. A cast a túlcsordulást sem bánja: a (byte)300 némán körbefordul, pontosan a B2-ben látott kilométeróra-effektussal.
ℹ️ JÓ TUDNI

Ha a túl nagy érték már a kódban látszik (byte b = (byte)300; konstansként), a fordító hibát ad — futásidejű változónál viszont némán körbefordul. Ugyanaz a kettősség, mint a B2 túlcsordulásánál.

A char-rejtély megoldása

A B4-ben előre vetítettük: a char egy szám, ami karakternek öltözött. A cast most felfedi ezt — mindkét irányban:

char betu = 'A';
int kod = (int)betu;
Console.WriteLine(kod);          // 65 — az 'A' Unicode-kódja

char masik = (char)66;
Console.WriteLine(masik);        // B

Console.WriteLine((char)('A' + 1));   // B — a char + int számol, a cast visszaöltöztet

Ez nem l'art pour l'art: a Mastermind színkódjainál és az ábécés feladatoknál mind jól jön majd.

4Szövegből szám: a Parse

És most következzen az egyik legtöbbet használt konverziós irány. A "42" nem szám — szöveg (B1, B4):

Console.WriteLine("42" + 2);     // 422 — fűzés! (B4)

A Parse metódusok a szöveget értelmezik, és igazi számot adnak:

string szoveg = "42";
int szam = int.Parse(szoveg);

Console.WriteLine(szam + 2);     // 44 — végre számolunk!

Minden számtípus tudja: int.Parse, double.Parse, decimal.Parse — a minta mindig típus.Parse(szöveg).

Amikor a szöveg nem szám

int szam = int.Parse("alma");    // 💥 FormatException — a program leáll!

A Parse kivételt dob (💥 — részletesen a K blokkban), ha a szöveg nem értelmezhető számként. Márpedig a felhasználó gépel majd mindenfélét…

⚠️ KULTÚRA-CSAPDA (B5 FOLYTATÁS)

A Parse is a gép nyelvi beállítását követi (B5): magyar gépen a double.Parse("3,5") működik, a double.Parse("3.5") viszont hibát dob — magyarul a tizedes VESSZŐ. Kódban pont (B1), felhasználó által megadott szövegben vessző. Figyelni kell erre!

5TryParse — a barátságos megoldás

A TryParse ugyanazt tudja, mint a Parse, de hibás szövegnél nem dob kivételt: visszatérési értéke egy bool — sikerült-e —, az eredmény (konverzió esetén a konvertált szám) pedig egy kimenő (out) változóba kerül:

string bemenet = "42";
bool sikerult = int.TryParse(bemenet, out int szam);

Console.WriteLine(sikerult);     // True
Console.WriteLine(szam);         // 42

És hibás szöveggel:

bool sikerult2 = int.TryParse("alma", out int szam2);

Console.WriteLine(sikerult2);    // False — de a program FUT tovább!
Console.WriteLine(szam2);        // 0 — sikertelen próbálkozásnál ezt kapod
ℹ️ RECEPTKÉNT HASZNÁLD

Az out kulcsszó pontos működését a D3-ban (metódusok) tanuljuk — addig minta alapján írd. A TryParse igazi ereje pedig a C blokkban lesz látható: az if-fel összekapcsolva („HA sikerült, számolj; HA nem, kérd újra”). Felhasználói inputhoz a TryParse lesz az alapértelmezésünk.

Melyik kapuval?

Melyik konverziós eszközt választanád a feladathoz?

1 / 8Pontszám: 0
…

6A Convert osztály

A harmadik út a Convert osztály (BCL — A3): Convert.ToInt32, Convert.ToDouble, Convert.ToString… A casttól egy fontos dologban tér el:

Console.WriteLine((int)2.9);              // 2 — a cast levág
Console.WriteLine(Convert.ToInt32(2.9));  // 3 — a Convert KEREKÍT
ℹ️ ÉRDEKESSÉG

A Convert „bankári kerekítést” használ: pontosan .5-nél a páros szomszédra kerekít (Convert.ToInt32(2.5) → 2, de Convert.ToInt32(3.5) → 4). Ez pénzügyi szabvány — a sok .5 így nem torzít egy irányba.

Melyik eszközt mikor? — az összefoglaló

FeladatEszközHibás adatnál
kicsi szám → nagy számimplicit (semmit sem írsz)nem fordulhat elő
nagy szám → kicsi szám, tört → egészcast: (int)xnémán levág/körbefordul
char ↔ kódcast: (int)'A', (char)65—
szöveg → szám, garantáltan jó szövegint.Parse(s)💥 FormatException
szöveg → szám, felhasználótólint.TryParse(s, out …)false — a program fut
tört → egész, kerekítveConvert.ToInt32(x)(szövegnél 💥)
szám → szövegToString(), $"…" (B4–B5)nem fordulhat elő

7Gyakori hibák

TünetMi történt?Mit tegyél?
CS0266: Cannot implicitly convert type 'double' to 'int'…lefelé (szűkebb típusba) nem megy magátólcast: (int)ertek — és tudd, hogy levág
(int)3.9 „rosszul számol” (3 lett)a cast levág, nem kerekítkerekítéshez Convert.ToInt32 (vagy később Math.Round)
💥 FormatException a Parse-nála szöveg nem értelmezhető számkéntfelhasználói inputnál TryParse
Magyar gépen a double.Parse("3.5") hibát doba beolvasás a kultúrát követi: tizedesVESSZŐ kella felhasználó vesszővel gépeljen — vagy TryParse + ellenőrzés
"42" + 2 megint 422a + string mellett fűz (B4)előbb int.Parse("42"), aztán számolj
(byte)300 → 44, „honnan a 44?”körbefordulás: 300 − 256 = 44ez a B2-es túlcsordulás — nagyobb típus kell

8Gyakorlat — a konverziós módszerek tesztje

  1. Új projekt: Console App, név: Konverziok, .NET 10.
  2. Cast-labor — jósold meg mindet előre (A9: fejben futtatás!), majd futtasd:
double d = 3.99;
Console.WriteLine((int)d);            // ?

int nagy = 300;
Console.WriteLine((byte)nagy);        // ?

Console.WriteLine((int)'A');          // ?
Console.WriteLine((char)('A' + 2));   // ?
  1. Parse-kísérlet: string szoveg = "42"; — írasd ki a szoveg + 2-t, majd az int.Parse(szoveg) + 2-t. Látod a 422 / 44 párost?
  2. Amikor hibára futunk: int.Parse("alma") — futtasd, és olvasd el figyelmesen a FormatException üzenetét. Ilyen egy futásidejű hiba (K blokk előzetes).
  3. TryParse-minta: futtasd a "42" és az "alma" bemenettel is; írasd ki a sikerult-öt és a számot. A Locals-ban is nézd meg (B1)!
  4. Kultúra-teszt: double.Parse("3,5") és double.Parse("3.5") — melyik megy a te gépeden? (Magyar beállításnál a vesszős.)
  5. Commitold (Konverziok gyakorlat).

9Feladatok

Gyakorló feladatok

⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás

B6.1⭐

Párosítsd: implicit · cast · Parse · TryParse — „szövegből szám, kivétel nélkül” · „kicsiből nagyba, magától” · „szövegből szám, jó adatnál” · „nagyból kicsibe, vállalt veszteséggel”.

B6.2⭐

Mit ír ki? Előbb papíron! (int)7.99 · (int)(-2.7) · (char)67 · (int)'a' · Convert.ToInt32(7.99)

B6.3⭐⭐

Írj „századfordító” programot: egy double celsius = 36.6; értékből számolj Fahrenheitet (celsius * 9 / 5 + 32), és írd ki egészre kerekítve ÉS egészre levágva is. Melyik eszközt hol használtad?

B6.4⭐⭐

A "120" szöveg egy termék ára. Számold ki 3 darab árát — először rontsd el szándékosan (összefűzéssel), aztán javítsd Parse-szal. Mennyi a különbség a két kimenet között?

B6.5⭐⭐⭐

Titkosírás-előkészítő: az 'A' kódjából kiindulva írasd ki egymás után az ábécé első 5 betűjét cast-okkal ((char)('A' + 0), (char)('A' + 1)…). Mi lenne az eljárás neve, ha minden betűt 3-mal tolnánk el? (Segítség: egy római hadvezérről nevezték el — és a J blokk kalandjátékában találkozunk még vele.)

10Önellenőrző kvíz

Ellenőrizd magad!

Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.

11Fogalomtár

FogalomJelentés
konverzióérték átalakítása egyik típusból a másikba
implicit konverzióautomatikus átalakítás kisebb típusból nagyobba — veszteség nem érheti
explicit konverzió (cast)kényszerített átalakítás: (céltípus)érték — a veszteséget te vállalod
levágás (truncation)a cast a törtrészt eldobja: (int)3.9 → 3
Parseszöveg → szám; nem értelmezhető szövegnél kivételt dob
FormatExceptiona hibás formátumú szöveg futásidejű hibája (kivételek: K blokk)
TryParseszöveg → szám kivétel nélkül: bool siker + out eredmény
out (recept)a metódus ezen az úton adja ki az eredményt — részletek: D3
Convertkényelmi konverziós osztály — törtből egészet kerekítve ad
bankári kerekítés.5-nél a páros szomszédra kerekít — a Convert ezt használja

12Összegzés

  1. Felfelé szabad az út (implicit): kicsiből nagyba a fordító magától konvertál — int → long, double, decimal.
  2. Lefelé cast kell: (int)3.9 → 3 (levág!), (byte)300 → 44 (körbefordul — B2). A veszteség a te felelősséged.
  3. A cast öltözteti át a char-t: (int)'A' → 65, (char)66 → 'B' — a B4-es rejtély beváltva.
  4. Szövegből szám: int.Parse("42") — de rossz szövegnél 💥 FormatException. Magyar gépen a törtekhez tizedesVESSZŐT vár!
  5. Felhasználói inputhoz TryParse: nem robban, bool-lal jelez — az if-fel a C blokkban áll össze fegyverré.
  6. A Convert kerekít, a cast levág — és .5-nél a páros felé (bankári kerekítés).