2017-02-03 1 views
0

Je suis tombé sur un comportement étrange que je ne comprends pas et ne peux pas trouver une réponse à. Avec SubClass1 et SubClass2 sous-classes étant à BaseClass j'ai la méthode:Variable avoir un type hors champ

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

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

Pour moi, il semble que les deux déclarations de variable sont dans différents champs d'application et que var serait soit SubClass1 ou SubClass2 selon le type réel de obj envoyé à la méthode.

Mais lorsque j'appelle cette méthode avec un objet de type SubClass2 la conversion de BaseClass à SubClass2 dans la clause else renvoie toujours null.

Lorsque je déboguer le code que je vois immédiatement lors de l'entrée du procédé, à savoir avant d'atteindre l'une quelconque des déclarations variable, variable est de type SubClass1 qui ofcource est la raison pour laquelle la distribution de obj rendements nuls.

Quelqu'un peut-il me dire pourquoi variable a un type avant qu'il ne soit déclaré?

+0

'Mais quand j'appelle cette méthode avec un objet de type SubClass2, la conversion de BaseClass en SubClass2 dans la clause else renvoie toujours null. C'est impossible. Il ne peut * jamais * être "nul" dans cette situation. – Servy

+3

C'est un comportement de débogueur, pas votre code. Ce sont deux variables distinctes, dans des portées distinctes, de types différents. Votre code n'aurait pas compilé autrement. Quelque chose d'autre se passe. – dasblinkenlight

+0

@Igor Le code ne peut jamais ne pas être lancé, étant donné que le type est vérifié en premier. – Servy

Répondre

3

Pour moi, il semble que les deux déclarations de variable sont dans différents champs d'application et que var serait soit SubClass1 ou SubClass2 selon le type de obj envoyé à la méthode actuelle.

Ce n'est pas vrai. Vous avez deux variables, l'une de type SubClass1 et l'autre de type SubClass2, elles ont toutes les deux le même nom. Les types de variables sont déterminés au moment de la compilation, pas à l'exécution. Votre code est identique à avoir écrit:

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

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

Votre code est tout simplement un sucre syntaxique pour ce code; vous empêchant d'avoir à taper les types des variables et de laisser le compilateur le déterminer pour vous.

Mais quand je l'appelle cette méthode avec un objet de type SubClass2 la distribution de BaseClass à SubClass2 dans l'autre article renvoie toujours null.

Ceci est impossible dans le code indiqué. Une distribution comme celle-ci ne peut se résoudre qu'à null si la valeur en cours est null et obj ne peut pas être null à ce stade de votre code, sinon GetType aurait émis une exception de référence nulle.

Quand je déboguer le code que je vois immédiatement en entrant dans la méthode, à savoir avant d'arriver à l'une des déclarations variable, variable est de type SubClass1 [...]

La première variable nommée variable est de type SubClass1, bien sûr. Le second est de type SubClass2. C'est ce que vous avez défini le type de ces variables au moment de la compilation.

qui est la raison pour laquelle la distribution de obj renvoie la valeur null.

Comme mentionné plus haut, il est pas résultat null. Ça ne peut pas. Si la variable n'était pas du bon type le code ne compilerait pas; cela ne changerait pas la valeur à l'exécution.

Quelqu'un peut-il me dire pourquoi variable a un type avant qu'il ne soit déclaré?

Le type de chaque variable est déterminé lorsque vous le compilez, sur la ligne que vous déclarez.

+0

Je serais prêt à être d'accord dans toutes vos déclarations, c'est exactement comment je vois les choses fonctionnent. Mais maintenant, je suis réellement un comportement différent et la réponse "Il ne peut pas" ne m'aide rien – user613068

+0

@ user613068 Soit vous ne voyez pas ce que vous prétendez voir, ou votre code est différent du code que vous avez montré. – Servy