2016-01-24 78 views
3

我無法從BaseClass<int>隱式轉換爲其DerivedClass。我有以下代碼:無法從BaseClass <int>隱式轉換爲DerivedClass

class BaseClass<T> 
{ 
} 

class DerivedClass : BaseClass<int> 
{ 
    int blah; 
} 

的方法。然而foo()返回一個BaseClass<int>對象不能做了以下工作:

DerivedClass tmp = foo(); 

更新:鑄造DerivedClass tmp = (DerivedClass)foo();也沒有工作。

+3

這是正確的。問題是什麼? – Dmitry

+0

你只能這樣做...... – Ian

回答

1

這是真的很基本的C#知識(或任何其他面向對象的語言,我知道)

如果你有class B : A你可以在派生類中分配給基類型像A myA = new B()一個變量,但你不能反過來像B myB = new A()一樣。

想象一下:

public class Animal 
{} 

public class Gnu : Animal 
{} 

public class Lion : Animal 
{} 

所以,你想要做這樣的事情:

Animal lion = new Lion(); // that's ok 
Gnu gnu = lion; // that will hurt! 

不要做這GNUS!

1

在面向對象編程中,類遵循所謂的「是」邏輯。派生類「是」基類,以使繼承有意義。

假設你有一個Person類和Employee類如下

class Person { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

class Employee : Person { 
    public decimal Salary { get; set; } 
    public string JobTitle { get; set; } 
} 

現在假設您在您的代碼Person一個實例,並嘗試將其分配給Employee。 C#無法理解這一點,因爲您創建的對象沒有SalaryJobTitle

var person = new Person(); 
var employee = (Employee) person; // heh? 

在另一方面,創造Employee實例,並將其強制轉換爲Person確實意義,因爲一個Employee「是」 PersonPerson不是Employee

3

這是由於繼承和上傳的規則。

讓我們說我們有A類和B是從它衍生出來的:

Class A{ 
} 

Class B : A{ 
} 

由於B A,那麼你可以做 A a = new B();

這是正確的,您只需通過'A'的眼睛來看看B即可。這叫做Upcasting。但

,A 不是一個B,這樣做是 B b = new A()

是不正確,B不能因爲它的父類實例化。

做到這一點的方法是像

B b = (B)a; 

被稱爲RTTI或溯造型。這在OOP中通常不被推薦。

希望有所幫助。

編輯:

的向下轉型的例子,我給了拋出一個錯誤,因爲,「一個」變量,是一個真正的A.

安全的向下轉換是這樣的:

A a = new B(); \\a is a B looking through A, upcasting. 
B b = (B)a; \\ this is downcasting, since now I want to use a with his B identity 
+0

答案是好的,但你可能會考慮使格式更好......;) – Ian

+0

現在好了嗎? –

+0

Downcasting拋出一個運行時錯誤@OrYaniv – zsf222

相關問題