[英]Assigning instance of a derived class to a variable of base class
您好,我是C#的新手,我正在嘗試找出“隱式轉換”操作。 我對此有一個疑問:
class Animal { }
class Monkey : Animal { }
Monkey m = new Monkey();
Animal a = m;
m.GetType()
[Submission#165+Monkey]
a.GetType()
[Submission#165+Monkey]
Monkey m2 = a; //這將調用-編譯器錯誤CS0266。 無法將類型“動物”隱式轉換為“猴子”。 一個明確的
轉換存在(您是否缺少演員表?)
我不明白-如果最后一行代碼拋出錯誤CS0266,為什么GetType方法返回“ a”變量的類型為“ Monkey”。 如果“ a”變量是Animal,如何找到它? 用什么方法?
GetType()
在運行時評估。 您得到的錯誤是在編譯時,即程序運行之前。
編譯器需要使用編譯時擁有的信息來確保類型安全。 確保意味着確保不會出錯 。 通常,將Animal
分配給Monkey
是不安全的,因為Tiger
也是動物,因此從理論上講,您最終可以將老虎分配給猴子類型的變量。
您可以告訴編譯器,盡管分配不安全,但是您知道自己在做什么。 您可以通過顯式強制轉換來做到這一點:
Monkey m2 = (Monkey)a;
在這里,您要告訴編譯器; “嘿,我知道這通常並不安全,但是請相信我,我知道 a
是一只Monkey
”。
編譯器將接受您的承諾,但不會完全信任您,因此將在運行時執行類型檢查以確保確定,並且如果您的承諾是謊言,則將收到運行時錯誤。
變量的類型為Animal
,編譯器將不允許您將其分配給Monkey
因為Animal
不一定是Monkey
。 您可以指定其他方式,因為Monkey
總是 Animal
。 GetType()
返回該變量所指向的對象的運行時類型 ,編譯器不知道該對象,也不知道任何相關信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.