2017-02-03 1 views
0

Ich stolperte in ein seltsames Verhalten, das ich nicht verstehe und kann keine Antwort finden. Mit SubClass1 und SubClass2 sind Subklassen BaseClass habe ich die Methode:Variable haben einen Typ außerhalb Geltungsbereich

private void SomeMethod(BaseClass obj) 
{ 
    if (obj.GetType() == typeof(SubClass1)) 
    { 
     var variable = (SubClass1) obj; 
    } 

    else if (obj.GetType() == typeof(SubClass2)) 
    { 
     var variable = (SubClass2) obj; 
    } 
} 

Mir scheint es, dass die beiden Erklärungen von variable sind in verschiedenen Bereichen und dass var würde entweder SubClass1 oder SubClass2 sein entsprechend der tatsächlichen Art von obj an die Methode gesendet.

Aber wenn ich diese Methode mit einem Objekt vom Typ SubClass2 aufrufen, gibt die Umwandlung von BaseClass nach SubClass2 in der Else-Klausel immer null zurück.

Wenn ich debuggen den Code ich, dass sofort, wenn das Verfahren der Eingabe, das heißt bevor ich einem der variable Erklärungen erreicht, variable vom Typ SubClass1 die ofcource Der Grund dafür ist die Besetzung von obj null zurück.

Kann mir jemand sagen, warum variable einen Typ haben, bevor sie deklariert ist?

+0

'Aber wenn ich diese Methode mit einem Objekt vom Typ SubClass2 aufrufen, gibt die Umwandlung von BaseClass zu SubClass2 in der Else-Klausel immer null zurück. Das ist unmöglich. Es kann in dieser Situation niemals "null" sein. – Servy

+3

Es ist ein Debugger-Verhalten, nicht Ihr Code. Dies sind zwei separate Variablen in unterschiedlichen Bereichen unterschiedlichen Typs. Ihr Code hätte sonst nicht kompiliert. Etwas anderes passiert. – dasblinkenlight

+0

@Igor Der Code kann niemals übergeben werden, da der Typ zuerst überprüft wird. – Servy

Antwort

3

Mir scheint es, dass die beiden Erklärungen von variable in verschiedenen Bereichen sind und dass var würden entweder von SubClass1 oder SubClass2 sein entsprechend der tatsächlichen Art von obj dem Verfahren gesendet.

Das stimmt nicht. Sie haben zwei Variablen, eine vom Typ SubClass1 und eine vom Typ SubClass2, beide haben zufällig denselben Namen. Die Typen der Variablen werden zur Kompilierzeit und nicht zur Laufzeit bestimmt. Ihr Code ist identisch geschrieben haben:

private void SomeMethod(BaseClass obj) 
{ 
    if (obj.GetType() == typeof(SubClass1)) 
    { 
     SubClass1 variable = (SubClass1) obj; 
    } 

    else if (obj.GetType() == typeof(SubClass2)) 
    { 
     SubClass2 variable = (SubClass2) obj; 
    } 
} 

Der Code ist einfach ein syntaktischer Zucker für diesen Code; Sie müssen die Typen der Variablen nicht eingeben und den Compiler nicht für Sie herausfinden lassen.

Aber wenn ich rufe diese Methode mit einem Objekt vom Typ SubClass2 die Besetzung von BaseClass zu SubClass2 in der else-Klausel immer null zurück.

Dies ist im angezeigten Code nicht möglich. Eine Umwandlung wie diese kann nur in null aufgelöst werden, wenn der zu übergebende Wert null ist und obj zu diesem Zeitpunkt in Ihrem Code nicht null sein kann, andernfalls hätte GetType eine Nullreferenzausnahme ausgelöst.

Wenn ich den Code debuggen ich sehe, dass sofort, wenn das Verfahren eintritt, das heißt, bevor ich eine der variable Erklärungen erreicht, ist variable vom Typ SubClass1 [...]

Die erste Variable mit dem Namen variable ist vom Typ SubClass1, sicher. Die zweite ist vom Typ SubClass2. Dazu haben Sie den Typ dieser Variablen zum Zeitpunkt der Kompilierung definiert.

welcher von cource ist der Grund, warum die Besetzung von obj Null zurückgibt.

Wie bereits erwähnt, ist es nicht in null führt. Es kann nicht. Wenn die Variable nicht vom richtigen Typ ist würde der Code nicht kompiliert; Es würde den Wert zur Laufzeit nicht ändern.

Kann mir jemand sagen, warum variable einen Typ haben, bevor es erklärt wird?

Der Typ jeder Variablen wird beim Kompilieren in der von Ihnen deklarierten Zeile festgelegt.

+0

Ich wäre bereit, in allen Ihren Aussagen zuzustimmen, es ist genau, wie ich Bilder Dinge arbeiten. Aber jetzt bin ich eigentlich experiance ein anderes Verhalten und die Antwort "It cant" hilft mir nichts – user613068

+0

@ user613068 Entweder Sie sehen nicht wirklich, was Sie behaupten zu sehen, oder Ihr Code ist anders als der Code, den Sie gezeigt haben. – Servy

Verwandte Themen