Konverze v C#   zodpovězená otázka

C#, WinForms, Grafika

Zdravím,

jsem nucen dělat jeden projekt v C# a vzhledem k mým nulovým zkušenostem, se našla chyba samozřejmě hned u prvního řádku.

Tento kód:

            int x1  = Convert.ToInt32( point3D[4].X.ToString());
            int y1 = Convert.ToInt32(point3D[4].Y.ToString());
            Point p1 = new Point(x1, y1);

            int x2 = Convert.ToInt32(point3D[5].X.ToString());
            int y2 = Convert.ToInt32(point3D[5].Y.ToString());
            Point p2 = new Point(x2, y2);

            int x3 = Convert.ToInt32(point3D[6].X.ToString());
            int y3 = Convert.ToInt32(point3D[6].Y.ToString());
            Point p3 = new Point(x3, y3);

            int x4 = Convert.ToInt32(point3D[7].X.ToString());
            int y4 = Convert.ToInt32(point3D[7].Y.ToString());
            Point p4 = new Point(x4, y4);

            Point[] Pts = {p1, p2, p3, p4};
            g.DrawImage(SystemIcons.Application.ToBitmap(), Pts);

My vyhodí výjimku "Not Implemented" na řádku g.DrawImage... Netuším, zda je to způsobeno mou prasečí konverzí z float na int nebo čím a tak prosím o radu někoho, kdo se v C# vyzná, děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak výjimka je způsobena tím, že jsem v poli předával 4 body namísto tří, ale pořád bych prosil o radu s tou konverzí.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Ta konverze je hodně moc prasečí, takhle se to nedělá ani ve VB.NET, ani v C#. Jak na to?

'VB.NET
Dim a As Single = CSng(5)
Dim b As Integer = CInt(a)

'C# - převody se řeší přetypováním
int b = (int)5.67F;
float a = (float)b;

Kde se vzalo záhadné F u čísla 5.67 v C#? Desetinná čísla v kódu jsou standardně v C# typu double, pokud je chceme float, musíme za ně dát to f.

Ve VB.NET se převádí (ale většinou to není potřeba) pomoc CInt, CDbl, CSng, CLong, CBool atd. a pro jiné typy pomocí CType nebo DirectCast.

V C# se to řeší přetypováním, datový typ se jednoduše napíše před přetypovávaný výraz v kulatých závorkách. Pak existuje ještě keyword as, ale ten je u čísel k ničemu.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Aha! To Fko mi tam chybělo. Půl hodiny trápení kvůli jedinému písmenu :-) Úsměvné.

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Taková drobná otázečka? :)

Víš co udělá kompilátor? ten vezme tvé slovíčko (int) najde ve třídě explicitní operátor, který obsahuje kód, který volá Convert.ToInt(x, x);

Takže je uplně jedno co použije ;) je to pouze na něm. Dokonce používání Convert.ToXxx(x, x); má výhody v tom, že se to chová neutralně mezi .NET jazyky.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Akorát že to je asi třikrát delší zápis, takže doporučuji používat (int)hodnota.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Vámi uváděný způsob přetypovávání mi připadá velice elegantní a hlavně v rámci textu přehledný, jenomže....

Onehdá jsem potřeboval kvůli něčemu drobnému pro svého syna sáhnout do hájenství C#, a narazil jsem na problém (zřejmě s nastavením "přísnosti" debbugeru, ale nenalezl jsem, co s tím).

Velice jednoduchá konstrukce (bez programátorského významu, je to pouze pro ilustraci)

 int promenna;

 promenna = (int)textBox1.Text;
 textBox2.Text = promenna.ToString;

mi vyhodí hned dvě chyby - u první konverze to řve, že nemůže konvertovat typ string na int, u té druhé, že nemůže použít metodu ToString na "non-delegate" typ String....

Se zlou se potážu i v případě druhé konverze typu

textBox2.Text = (string)promenna ;

Jediné co funguje je ta "dlouhá" varianta:

int promenna;

promenna = Convert.ToInt32(textBox1.Text);
textBox2.Text = Convert.ToString(promenna);

, takže oba zápisy zcela ekvivalentní asi nejsou. Jak ve VS 2008 Express zapnout, aby se to spokojilo i s tím zápisem kratším?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback