2010-04-05 30 views
6

chciałem użyć coś takiego:Jak zmienić typ zmiennej w C#?

if(x==5) 
{ 
    var mydb= ........ ; 
} 
else 
{ 
    var mydb = ........ ; 
} 

ale to nie działa, ponieważ nie mogę zadeklarować zmienną wewnątrz if.

Więc starałem się to zrobić:

var mydb; 

if (x==5) 
{ 
    mydb= ............. ; 
} 
else 
{ 
    mydb=.............; 
} 

ale id nie działa albo dlatego musiałem zainicjować zmienną (mydb).

Pytanie brzmi: nie znam typu zmiennej, czy mogę ją zadeklarować, a następnie zmienić typ wewnątrz instrukcji if?

Odpowiedz

11

Nie, nie możesz. Zmienne nigdy nie zmieniają swoich typów. Jakich typów jesteś naprawdę zainteresowany? Czy możesz zadeklarować, że zmienna jest typowym typem bazowym lub interfejsem implementowanym przez oba typy? Jeśli możesz powiedzieć nam więcej o swojej sytuacji, możemy być w stanie Ci pomóc.

C# jest statycznie napisanym językiem (pomijając C# 4; wprowadza dynamiczne pisanie tam, gdzie naprawdę go potrzebujesz, ale warto zrozumieć "normalny" sposób działania C#). Kompilator musi znać typ zmiennej, aby móc sprawdzić, co oznaczają poszczególne odniesienia. Na przykład, jeśli używasz

string x = "text"; 
int y = x.Length; 

kompilator musi wiedzieć, że x jest typu string tak, że może sprawdzić, czy typ ma właściwość Length i emitują wywołanie go w IL.

+0

http://msdn.microsoft.com/en-us/library/dd264736%28v=VS.100%29.aspx –

+0

@drorhan: Tak, ale to nie jest prawie na pewno dobrym rozwiązaniem tutaj - ja Zachęcają początkujących C# do kierowania * dobrze * z dala od dynamicznego pisania, dopóki nie poczują się komfortowo z "normalnym" (statycznym) C#. –

+0

Być może typ obiektu może być pomocny. http://msdn.microsoft.com/en-us/library/9kkx3h3c%28VS.80%29.aspx –

3

C# jest statycznie wpisane, chyba że używasz 4.0 z dynamic specifier, więc zmiana typu jest klasycznie niemożliwe, z wyjątkiem polimorfizmu.

+2

Zmienne wpisane jako dynamiczne wciąż mają typ statyczny: typ dynamiczny. Nie ma sposobu na zmianę typu * zmiennej *. –

1

Można zadeklarować typ podstawowy i dziedziczyć z niego oba typy. Ale główne pytanie brzmi: Jak będziesz go używać, jeśli nie znasz jego typu?

+0

Polimorfizm, oczywiście. –

6

można użyć:

object mydb = null; 

if(x==5) 
{ 
    mydb= ........ ; 
} 
else 
{ 
    mydb = ........ ; 
} 

ale trzeba unbox lub oddania przedmiotu z powrotem do właściwego typu, gdy chcesz uzyskać dostęp do pól, właściwości, metody obiektu. chyba że będziesz czekać na C# 4, który może ułatwić metodę dynamiczną (dokładna terminologia: dynamiczna wysyłka?) wywołanie

+1

Jeśli nie masz do czynienia z typem wartości, nie jest tworzone żadne pole, więc termin "unbox" jest niewłaściwy. Typy wartości są umieszczane w polu, jeśli są używane jako obiekt, aby można je było umieścić na stercie (normalnie obiekty wartości mogą żyć tylko na stosie). – helium

+2

+1, ponieważ ta odpowiedź wszystkich dotychczas wydaje się najbliższa temu, o co prosił OP. Jednak możesz początkowo ustawić 'mydb' na' null', aby uniknąć ostrzeżenia/błędu kompilatora. – stakx

1

Zakładam, że masz dwa niekompatybilne typy z dwóch różnych bibliotek, które reprezentują bazę danych. Możesz napisać interfejs z typowymi operacjami i zapisać adaptery, które zawijają klasy pochodzące z bibliotek i implementują twój interfejs. Niż typ twojej zmiennej mydb może być tym interfejsem.

Oczywiście można użyć object jako typu dla mydb i użyć testów dynamicznych i rzutów, ale byłaby to bardzo zła decyzja projektowa w tym przypadku.

0

MOŻNA UŻYWAĆ SYSTEMU .CONVERT CLASS like this OR używać dynamicznych

string possibleInt = "1234"; 
int count = Convert.ToInt32(possibleInt); 

LUB używania jawnego Konwersje

W języku C#, można użyć operatora cast wykonywać jawne konwersje. Gips określa typ konwertowany na nawias okrągły. Składnia do wykonania jawnej konwersji jest pokazana w poniższym przykładzie kodu.

DataType variableName1 = (castDataType) variableName2; 
0

można używać jak to wynik bool = (warunek)? prawda fałsz ;

var myDB = (x==5) ? true : false ; 
or 
var myDB = x==5 ? "doing something when case is true" : "doing something when case is false" ;