给出这个例子:
Animal thisIsACat = new Cat();
是否存在从Cat
到Animal
的隐式转换?
澄清:
假设:
class Animal
{
}
class Cat: Animal
{
}
答案 0 :(得分:9)
请注意,这是一个隐式转换(它在规范的第6.1.6节中定义),但它不会更改要转换的对象的引用标识。
答案 1 :(得分:3)
那里没有转换 - 您的对象是Cat
,并且始终是Cat
- 只有变量列为Animal
,而不是对象本身。
转换将是您获取Cat
对象,对其执行操作的地方,然后突然您现在拥有类型为Animal
的不同对象。在这种情况下没有意义。
在处理结构时,转换更有意义。 Integer
5可以转换为Decimal
5米,它们是两个完全不同的对象。
代码:
int i = 5;
decimal d = i;
将是一个隐式转换,因为5是System.Int32
,但它被转换为5米,这是System.Decimal
,与原始对象完全不同。
答案 2 :(得分:0)
我不得不假设Animal
是一个接口(或抽象类)。数据类型Cat必须实现Animal接口...所以是的,您有从new Cat()
到Animal的隐式转换。从Animal到Cat的转换必须明确:例如(Cat)thisIsACat
继续阅读关于子类型多态性的资源,你会看到:OriginsThe notion of subtyping in programming languages可以追溯到20世纪60年代;它是在Simula衍生物中引入的。 John C. Reynolds在1980年给出了第一种正式的子类型处理方法,他们使用类别理论来形式化implicit conversions和Luca Cardelli(1985)。
具体来说,在这种情况下,我们有两种类型:动物和猫。 Cat是Animal的子类型:类型转换,类型转换和强制是指隐式或显式地将一种数据类型的实体更改为另一种数据类型的不同方式