2010-04-05 9 views
6

Ich wollte so etwas verwenden: if-AnweisungWie ändert man einen Variablentyp in C#?

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

aber es hat nicht funktioniert, weil ich in eine Variable deklarieren kann nicht. So

Ich habe versucht, dies zu tun:

var mydb; 

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

aber id hat nicht funktioniert entweder, weil ich hatte die Variable (mydb) zu initialisieren.

Also die Frage ist: Ich kenne nicht unbedingt den Typ der Variablen, kann ich es trotzdem deklarieren und dann den Typ innerhalb der if-Anweisung ändern?

Antwort

11

Nein, das geht nicht. Variablen ändern ihre Typen niemals. An welchen Arten interessiert dich das eigentlich? Können Sie die Variable als einen gemeinsamen Basistyp oder eine Schnittstelle deklarieren, die beide implementieren? Wenn Sie uns mehr über Ihre Situation erzählen können, können wir Ihnen vielleicht mehr helfen.

C# ist eine statisch getippte Sprache (abgesehen von C# 4; das führt dynamisches Schreiben dort ein, wo Sie es wirklich brauchen, aber es lohnt sich, die "normale" C# -Weise zu kennen). Der Compiler muss den Typ der Variablen kennen, um herauszufinden, was jeder Verweis darauf bedeutet. Wenn Sie zum Beispiel verwenden

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

die Compiler wissen muss, dass x vom Typ string, so dass er überprüfen kann, dass der Typ eine Length Eigenschaft hat und einen Anruf, um es in dem IL emittieren.

+0

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

+0

@drorhan: Ja, aber das hier mit ziemlicher Sicherheit nicht die richtige Lösung ist - I würde C# -Einsteiger dazu ermutigen, sich vom dynamischen Schreiben zu befreien, bis sie mit "normalem" (statischem) C# vertraut sind. –

+0

Vielleicht kann der Objekttyp Hilfe sein. http://msdn.microsoft.com/en-us/library/9kkx3h3c%28VS.80%29.aspx –

3

C# wird statisch eingegeben, es sei denn, Sie führen 4.0 mit dynamic specifier aus, daher ist das Ändern des Typs klassisch unmöglich, außer über Polymorphie.

+2

Variablen, die als dynamisch eingegeben wurden, haben weiterhin einen statischen Typ: den dynamischen Typ. Es gibt keine Möglichkeit, den Typ einer * Variablen * zu ändern. –

1

Sie können den Basistyp deklarieren und beide Typen davon erben. Aber die Hauptfrage ist: Wie wirst du es benutzen, wenn du seinen Typ nicht kennst?

+0

Polymorphismus, natürlich. –

6

können Sie:

object mydb = null; 

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

aber man muss unbox oder das Objekt wieder in seine richtige Art zu werfen, wenn Sie die Objektfelder, Eigenschaften, Methoden zugreifen möchten. es sei denn, Sie warten auf C# 4, die dynamische Methode erleichtern kann (genaue Terminologie: dynamische Versendung?) Aufruf

+1

Wenn Sie nicht mit einem Werttyp arbeiten, wird keine Box erstellt, daher ist der Begriff "unbox" nicht geeignet. Werttypen werden in eine Box eingefügt, wenn sie als Objekt verwendet werden, damit sie auf den Heap gesetzt werden können (normalerweise können Wertobjekte nur auf dem Stapel leben). – helium

+2

+1, weil diese Antwort von allem bisher dem zu entsprechen scheint, um was das OP gebeten hat. Möglicherweise müssen Sie jedoch zunächst 'mydb' auf' null' setzen, um eine Compiler-Warnung/einen Compilerfehler zu vermeiden. – stakx

1

Ich nehme an, dass Sie zwei inkompatible Typen aus zwei verschiedenen Bibliotheken haben, die beide eine Datenbank darstellen. Sie könnten eine Schnittstelle mit den allgemeinen Operationen schreiben und Adapter schreiben, die die Klassen aus den Bibliotheken umschließen und Ihre Schnittstelle implementieren. Dann könnte der Typ Ihrer Variablen mydb diese Schnittstelle sein.

Natürlich könnten Sie object als Typ für mydb verwenden und dynamische Typprüfungen und Umwandlungen verwenden, aber das wäre eine sehr schlechte Designentscheidung in diesem Fall.

0

Sie können SYSTEM verwenden.CONVERT CLASS LIKE THIS OR Dynamischer

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

oder explizite Konvertierungen

In C# verwenden, können Sie einen Cast-Operator verwenden, um explizite Konvertierungen durchzuführen. Eine Umwandlung gibt den zu konvertierenden Typ in runden Klammern an. Die Syntax zum Ausführen einer expliziten Konvertierung wird im folgenden Codebeispiel gezeigt.

DataType variableName1 = (castDataType) variableName2; 
0

Sie können wie diese verwenden bool result = (Bedingung)? wahr falsch ;

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