变量具有类型外部范围

时间:2017-02-03 15:07:58

标签: c# scope var

我偶然发现了一些我不理解的奇怪行为,无法找到答案。 SubClass1SubClass2BaseClass的子类我有方法:

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

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

对我来说,似乎variable的两个声明属于不同的范围,var根据SubClass1SubClass2的实际类型obj {1}}发送到该方法。

但是当我使用类型为SubClass2的对象调用此方法时,else子句中从BaseClassSubClass2的强制转换始终返回null。

当我调试代码时,我在进入方法时立即看到,即在我到达任何variable声明之前,variable的类型为SubClass1,其中ofcource是obj的强制转换返回null。

有人可以告诉我为什么variable在宣布之前有类型吗?

1 个答案:

答案 0 :(得分:3)

  

对我来说,似乎variable的两个声明属于不同的范围,var根据SubClass1SubClass2的实际类型obj {1}}发送到该方法。

那不是真的。您有两个变量,一个是类型SubClass1,另一个是类型SubClass2,它们恰好都具有相同的名称。变量'类型是在编译时确定的,而不是运行时。您的代码与完全相同已编写:

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

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

您的代码只是此代码的语法糖;防止你需要输入变量'类型并让编译器为您解决。

  

但是当我使用类型为SubClass2的对象调用此方法时,else子句中从BaseClassSubClass2的强制转换始终返回null。

这在显示的代码中是不可能的。如果正在投放的值为nullnull在您的代码中的obj不能null,那么这样的投射只能解析为GetType variable会抛出Null Reference Exception。

  

当我调试代码时,我立即在输入方法时看到,即在我到达任何variable声明之前,SubClass1类型为variable [...] < / p>

第一个名为SubClass1的变量属于SubClass2类型,当然。第二个是obj类型。那就是你在编译时定义这些变量的类型。

  

cource中的哪个是null的强制转换返回null的原因。

如前所述,它导致variable。它不可能。如果变量不是正确类型,则代码不会编译;它不会在运行时更改值。

  

有人可以告诉我为什么printOne在宣布之前有类型吗?

每个变量的类型在编译时确定,在您声明它的行上。