Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
mnauik
Člen
Avatar
mnauik:29.1.2014 12:43

Jsem si hrál trochu s C# a narazil jsem na toto:

static void Main(string[] args)
 {
     Ahoj(3.1);
     Ahoj(3.1f);
     Ahoj(300);
     Console.ReadLine();
 }

 static void Ahoj(Object o)
 {
     Console.WriteLine("Ahoj objekte");
 }

 static void Ahoj(float i)
 {
     Console.WriteLine("Ahoj float");
 }

 static void Ahoj(double i)
 {
     Console.WriteLine("Ahoj double");
 }

 static void Ahoj(byte i)
 {
     Console.WriteLine("Ahoj bajte");
 }

Výstup:
Ahoj double
Ahoj float
Ahoj float

Proč to 300 bere jako float? Nebo je chyba někde jinde? Proč?

Odpovědět
29.1.2014 12:43
minusuj mě, ale zdůvodni to ;)
Avatar
Paradise
Tvůrce
Avatar
Paradise:29.1.2014 12:56

Protože do byte se nevejde? Když tam přidáš verzi s int, tak to bude vypisovat ahoj int.

 
Nahoru Odpovědět
29.1.2014 12:56
Avatar
mnauik
Člen
Avatar
Odpovídá na Paradise
mnauik:29.1.2014 13:36

To vím, jsem právě očekával, že to nevezme jako byte. Ale myslel jsem, že to vezme např. jako object (jako to vzal u bool a jako by to vzal floatu nebo doublu, kdybych ty metody s parametrem doublu nebo floatu odstranil).

Chápu tedy dobře, že se to nejdřív snažilo konvertovat na nějaký primitivní datový typ, který je parametrem některé z metod, a pokud to takovou metodu nenajde, tak použije metodu s parametrem Object?

Nahoru Odpovědět
29.1.2014 13:36
minusuj mě, ale zdůvodni to ;)
Avatar
Nahoru Odpovědět
29.1.2014 14:02
https://www.facebook.com/peasantsandcastles/
Avatar
petrph
Člen
Avatar
petrph:29.1.2014 15:15

Nebo tedy ještě jináč, to co jsi použil je docela nebezpečná konstrukce. Totiž více přetížených metod,které se liší pouze rozdílnými datovými typy u stejného parametru-když je mezi těmi typy možná automatická konverze,tam snadno může vzniknout chyba na kterou jsi narazil. Čili se tomu pokud možno vyhnout a nebo to pořádně promyslet, ošetřit a otestovat.
Viz jak píše spraveně píše Paradise- do byte se ti 300 nevejde, čili program použil nejbližší možnou metodu s float.Ale je to ještě složitější, můžeš si zkusit zaexperimentovat-dejme tomu zavolat Ahoj(15) ve 3 případech :

  1. existuje pouze void Ahoj(double i) b) Existují Ahoj(byte i) a Ahoj(int i) c) existuje pouze Ahoj(int i)

a uvidíš že ti pokaždé vypíše naprosto jiný typ. Vítej do klubu..

 
Nahoru Odpovědět
29.1.2014 15:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.