Proč se pole typu Object přetypuje na pole typu String??   zodpovězená otázka

VB.NET

- Visual Studio 2010 Ultimate

Dobrý den,

mám takový problém a vůbec ho nechápu. Mám definovanou proměnnou typu Object. A do ní přiřazuji pole a vše je v pořádku:

Dim params as Object
Dim datum as DateTime = DateTime.Today
params = {"VYUCT_TRZBA_INSERT", datum}

Teď obsahuje proměnná params pole se dvěma hodnotami. A to se Stringem a datem. Ale když do ní přiřadím více druhů datových typů:

params = {"VYUCT_TRZBA_INSERT", datum, 15, 15.4F, 13.148}

Nejspíš 5 druhů a více. Tak se všechny položky v tom poli přetypují na String. A najednou proměnná params obsahuje pole stringu (String()). Naprosto nechápu proč se děje tato konverze. Mohl by mi to někdo vysvětlit?

Děkuji.

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

Není lepší použít pole objectů, to funguje korektně.

Dim datum As DateTime = DateTime.Now
Dim obj() As Object = {datum, "ahoj", 123, 123.4, 123.4F}
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano, máte pravdu, tohle funguje korektně.

Ale pořád stejně nechápu tu konverzi, když u 2 druhů to funguje, a u 5 už ne. Ale tj jedno, děkuji za odpověď :)

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

Abych řekl pravdu, tak to pole objectů je jenom možnost, jak to obejít, není to řešení. Taky by mě zajímalo, proč při přiřazení stringu a dvou dalších proměnných se to celé přetypuje na string[].

Při použití několika různých datových typů, kromě stringu, se nic nepřetypuje.

Třeba se k tomu vyjádří někdo zkušenější.

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

Také by mě to zajímalo, nicméně ve firmě máme přikázáno, pokud píšeme ve VB, používat option strict on, což těmto konstrukcím zamezí.

Pak je nutné použít

př.:

params = New Object() {"VYUCT_TRZBA_INSERT", datum, 15, 15.4F, 13.148}

Což funguje také správně.

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

Podobné opičárny se dějí při vypnutém Option Strict. Bohužel je to výchozí nastavení. Pokud se podíváte Reflectorem co VB kompilátor vyzvracel, najdete toto:

Dim params As Object = New String()
{"VYUCT_TRZBA_INSERT",
Conversions.ToString(datum),
Conversions.ToString(15),
Conversions.ToString(CSng(15.4!)),
Conversions.ToString(CDbl(13.148))}

Proč to tak je, NEVÍM.

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

Za to může type inference, tedy odvození typu pole z datových typů prvků.

VB se podívá na první prvek a vidí, že to je string. Pak se podívá na druhý a vidí, že to je datum, ale existuje automatická konverze na string (protože Option Strict je vypnutý), tak z něj udělá string. To samé u třetího a čtvrtého prvku, protože existuje automatická konverze stringu na ty datové typy, tak to zkonvertuje.

Pokud byste byl v C# nebo měl zapnutý Option Strict, tak se kompilátor zase podívá na první prvek a vidí tam string, u druhého prvku ale neexistuje automatická konverze na ten typ, takže vezme společného předka obou těch typů a to je Object.

Nic jiného v tom není.

Ve VB.NET se dá celkem dobře psát i s vypnutým Option Strict, jen si člověk musí uvědomit, kde všude přijde na řadu automatická konverze. Je občas celkem zapeklité uvědomit si, co to kdy udělá, takže doporučuju buď všude ty typy expicitně uvádět, nebo Option Strict zapnout (tím se ale člověk připraví o část té "krásy", kterou VB nabízí - některé situace vytvořené automatickou konverzí jsou velmi hezké, na druhou stranu z praktického hlediska a kvůli srozumitelnosti je Option Strict určitě lepší volba).

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