You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中Shape r = new Square()执行结果及Square独有方法不可访问原因解析

问题1解答

执行Shape r = new Square();时,实际创建的实例类型是Square。
C#中对象的实际类型由等号右侧的new关键字后指定的类型决定,和左侧用来接收实例引用的变量声明类型无关。Shape只是引用变量r的声明类型,它仅限定了这个引用可以“看到”的成员范围,不会改变实例本身的实际类型。

问题2解答

这个现象是C#中编译时类型检查和运行时类型识别分离的特性导致的:

  • GetType()是运行时执行的方法,它会读取实例在内存中存储的类型元数据,返回实例的实际运行时类型,所以这里得到的是Square。
  • 方法访问的合法性是在编译阶段就检查的:编译器只会根据变量的声明类型(也就是Shape)来判断你调用的方法是否存在,Shape的定义里没有SquareOnlyMethod,所以编译阶段就会直接报错,不会等到运行时再判断实际实例类型。

关于“Shape实例创建时带有Square的内存布局”的解释

这个表述更准确的理解是:你创建的Square实例,内存布局完全符合Shape类型的约定,所以可以用Shape类型的引用指向它。
实际在托管堆上分配的Square实例内存是完整的,包含了整个继承链的所有成员:从基类Shape的成员,到父类Rectangle的成员,再到Square自己定义的SquareOnlyMethod相关的元数据都存在。但是当你用Shape类型的引用去持有这个实例时,相当于你给这个实例套了一层Shape的“访问掩码”,编译器只允许你访问Shape类型定义中公开的成员,哪怕底层实例实际上有更多可用的成员,你也必须先把引用转型为Square类型之后才能调用独有方法。

你可以通过显式转型访问到这个方法,示例代码如下:

if (r is Square square)
{
    Console.WriteLine(square.SquareOnlyMethod()); // 正常输出 I am a square
}

内容的提问来源于stack exchange,提问作者EvilDr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:51:03