2016-01-24 79 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

相关问题