我偶然发现了一些我不理解的奇怪行为,无法找到答案。 SubClass1
和SubClass2
是BaseClass
的子类我有方法:
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
根据SubClass1
或SubClass2
的实际类型obj
{1}}发送到该方法。
但是当我使用类型为SubClass2
的对象调用此方法时,else子句中从BaseClass
到SubClass2
的强制转换始终返回null。
当我调试代码时,我在进入方法时立即看到,即在我到达任何variable
声明之前,variable
的类型为SubClass1
,其中ofcource是obj
的强制转换返回null。
有人可以告诉我为什么variable
在宣布之前有类型吗?
答案 0 :(得分:3)
对我来说,似乎
variable
的两个声明属于不同的范围,var
根据SubClass1
或SubClass2
的实际类型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子句中从BaseClass
到SubClass2
的强制转换始终返回null。
这在显示的代码中是不可能的。如果正在投放的值为null
且null
在您的代码中的obj
不能null
,那么这样的投射只能解析为GetType
variable
会抛出Null Reference Exception。
当我调试代码时,我立即在输入方法时看到,即在我到达任何
variable
声明之前,SubClass1
类型为variable
[...] < / p>
第一个名为SubClass1
的变量属于SubClass2
类型,当然。第二个是obj
类型。那就是你在编译时定义这些变量的类型。
cource中的哪个是
null
的强制转换返回null的原因。
如前所述,它不导致variable
。它不可能。如果变量不是正确类型,则代码不会编译;它不会在运行时更改值。
有人可以告诉我为什么
printOne
在宣布之前有类型吗?
每个变量的类型在编译时确定,在您声明它的行上。