B blokk · Változók és típusok · 6. tananyag
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.
(int)3.9) és
a kis típusokkal ((byte)).Parse —
és tudod, mi történik hibás szövegnél.TryParse-t — a leendő
alapértelmezésedet felhasználói inputhoz.Convert, és
miben tér el a casttól.Mielőtt a részletekbe megyünk, nézd a nagy képet:
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.
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.
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:
(int)3.9 → 3,
(int)-3.9 → −3. (Ha kerekíteni akarsz, arra a
Math.Round való — az I. blokk témája.)(byte)300 némán körbefordul, pontosan a
B2-ben látott
kilométeróra-effektussal.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 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.
É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).
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…
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
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 konverziós eszközt választanád a feladathoz?
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
Convert kerekít, a cast levág.Convert.ToInt32(szoveg) a
Parse-hoz hasonlóan kivételt dob rossz szövegre —
ebben nem barátságosabb.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.
| Feladat | Eszköz | Hibás adatnál |
|---|---|---|
| kicsi szám → nagy szám | implicit (semmit sem írsz) | nem fordulhat elő |
| nagy szám → kicsi szám, tört → egész | cast: (int)x | némán levág/körbefordul |
| char ↔ kód | cast: (int)'A', (char)65 | — |
| szöveg → szám, garantáltan jó szöveg | int.Parse(s) | 💥 FormatException |
| szöveg → szám, felhasználótól | int.TryParse(s, out …) | false — a program fut |
| tört → egész, kerekítve | Convert.ToInt32(x) | (szövegnél 💥) |
| szám → szöveg | ToString(), $"…" (B4–B5) | nem fordulhat elő |
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
CS0266: Cannot implicitly convert type 'double' to 'int'… | lefelé (szűkebb típusba) nem megy magától | cast: (int)ertek — és tudd, hogy levág |
(int)3.9 „rosszul számol” (3 lett) | a cast levág, nem kerekít | kerekítéshez Convert.ToInt32 (vagy később Math.Round) |
💥 FormatException a Parse-nál | a szöveg nem értelmezhető számként | felhasználói inputnál TryParse |
Magyar gépen a double.Parse("3.5") hibát dob | a beolvasás a kultúrát követi: tizedesVESSZŐ kell | a felhasználó vesszővel gépeljen — vagy TryParse + ellenőrzés |
"42" + 2 megint 422 | a + 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 = 44 | ez a B2-es túlcsordulás — nagyobb típus kell |
Konverziok, .NET 10.double d = 3.99; Console.WriteLine((int)d); // ? int nagy = 300; Console.WriteLine((byte)nagy); // ? Console.WriteLine((int)'A'); // ? Console.WriteLine((char)('A' + 2)); // ?
string szoveg = "42"; —
írasd ki a szoveg + 2-t, majd az
int.Parse(szoveg) + 2-t. Látod a 422 / 44 párost?int.Parse("alma") —
futtasd, és olvasd el figyelmesen a FormatException
üzenetét. Ilyen egy futásidejű hiba (K blokk előzetes)."42" és az
"alma" bemenettel is; írasd ki a
sikerult-öt és a számot. A Locals-ban is nézd meg
(B1)!double.Parse("3,5")
és double.Parse("3.5") — melyik megy a te gépeden?
(Magyar beállításnál a vesszős.)Konverziok gyakorlat).⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
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”.
Mit ír ki? Előbb papíron!
(int)7.99 · (int)(-2.7) ·
(char)67 · (int)'a' ·
Convert.ToInt32(7.99)
Í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?
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?
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.)
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelenté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 |
Parse | szöveg → szám; nem értelmezhető szövegnél kivételt dob |
FormatException | a hibás formátumú szöveg futásidejű hibája (kivételek: K blokk) |
TryParse | szö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 |
Convert | ké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 |
int →
long, double,
decimal.(int)3.9 → 3
(levág!), (byte)300 → 44 (körbefordul —
B2). A veszteség a te
felelősséged.(int)'A' → 65, (char)66 →
'B' — a B4-es rejtély beváltva.int.Parse("42") —
de rossz szövegnél 💥 FormatException. Magyar
gépen a törtekhez tizedesVESSZŐT vár!TryParse:
nem robban, bool-lal jelez — az
if-fel a C blokkban áll össze fegyverré.Convert kerekít, a cast levág —
és .5-nél a páros felé (bankári kerekítés).