我无法隐式地从BaseClass<int>
转换为DerivedClass
。我有以下代码:
class BaseClass<T>
{
}
class DerivedClass : BaseClass<int>
{
int blah;
}
但是,返回foo()
对象的方法BaseClass<int>
无法进行以下操作:
DerivedClass tmp = foo();
更新:投射DerivedClass tmp = (DerivedClass)foo();
也无效。
答案 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#无法理解这一点,因为您创建的对象没有Salary
或JobTitle
。
var person = new Person();
var employee = (Employee) person; // heh?
另一方面,创建Employee
的实例并将其转换为Person
确实是有意义的,因为Employee
&#34;是& #34; Person
但Person
不是Employee
。