Avatar
mnauik
Člen
Avatar
mnauik:

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  +1 29.1.2014 12:43
minusuj mě, ale zdůvodni to ;)
Avatar
Paradise
Redaktor
Avatar
Paradise:

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

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

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
petrph
Člen
Avatar
petrph:

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.