无法从BaseClass <int>隐式转换为DerivedClass

时间:2016-01-24 15:40:35

标签: c#

我无法隐式地从BaseClass<int>转换为DerivedClass。我有以下代码:

class BaseClass<T>
{
}

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

但是,返回foo()对象的方法BaseClass<int>无法进行以下操作:

DerivedClass tmp = foo();

更新:投射DerivedClass tmp = (DerivedClass)foo();也无效。

3 个答案:

答案 0 :(得分: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 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

答案 1 :(得分: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这样做!

答案 2 :(得分:1)

在面向对象的编程中,类遵循所谓的&#34;是&#34;逻辑。派生类&#34;是&#34;基类,为了使继承有意义。

假设您有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&#34;是& #34; PersonPerson不是Employee