这是一个愚蠢的问题,但看到不同的行为却感到震惊。学到很多。
假设我下面有两个类
Class A
{
public void Display()
{
}
}
Class B : A
{
public void Display()
{
}
}
Class C : B
{
public void Display()
{
}
}
Class Final
{
static void Main()
{
var c = new C();
// B c = new C();
}
}
我的疑问是,以上两者给出了不同的结果。我可以知道 B c = new C()
创建 B 或 C 的对象吗?我的理解是,它创建了 B 的对象。那为什么我们说 new C()
?我同意 C c = new C();
但我想,B b = new C();
创建 B 的对象。我们在哪里使用这种风格?仅在使用运行时多态性时? (覆盖方法)?
最佳答案
使用 var
keyword 声明变量时,编译器从赋值的右侧推断变量的类型。特别是,它使用赋值运算符 (=
) 右侧表达式的计算结果类型。
因此,对于你的声明
var c = new C();
,变量c
将被声明为类型C
。
如果你想让c
有任何其他类型,基本上有两个选择:
- 要么明确指出
c
的类型:B c = new C();
- 或者,您可以更改右侧表达式以将其识别为选择的类型:
var c = (B)(new C());
至于你更详细的问题:
B c = new C()
创建类型C
的实例。这就是new C()
所做的。变量c
被类型化为B
的事实仅意味着编译器将假定c
具有B 类型的任何属性和方法
,但不一定是C
类型。同样,您以后不仅可以将类型C
的实例分配给c
,还可以将类型B
的实例分配给c
。<- 确实,当您不确定
c
是否会在某个时刻引用类型B
的实例,而不是排他性地引用类型的实例时,您可以使用这种样式>C
.
关于c# - var 和 Class 类在对象创建上的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891694/