簡體   English   中英

將派生類的實例分配給基類的變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM