[英]Run-time type vs compile-time type in C#
C#中的運行時類型和編譯時類型之間有什么區別?虛擬方法調用有什么含義?
假設我們有兩個類A
和B
聲明如下:
internal class A
{
internal virtual void Test() => Console.WriteLine("A.Test()");
}
internal class B : A
{
internal override void Test() => Console.WriteLine("B.Test()");
}
B
繼承自A
並覆蓋方法Test
,該方法將消息輸出到控制台。
C#中的運行時類型和編譯時類型有什么區別
現在讓我們考慮以下聲明:
A test = new B();
在編譯時:編譯器只知道變量test
是A
類型。 他不知道我們實際上是在給他一個B
的例子。 因此,編譯類型的test
是A
在運行時:已知test
類型為B
,因此運行時類型為B
以及虛擬方法調用存在什么含義
請考慮以下代碼語句:
((A)new B()).Test();
我們正在創建一個B
實例,將其轉換為A
並在該對象上調用Test()
方法。 編譯器類型為A
,運行時類型為B
當編譯器想要解析.Test()
調用時,他遇到了問題。 因為A.Test()
是virtual
所以編譯器不能簡單地調用A.Test
因為存儲的實例可能已經覆蓋了該方法。
編譯本身無法確定調用A.Test()
或B.Test()
。 被調用的方法由運行時確定,而不是由編譯器“硬編碼”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.