C# 动物thisIsACat=新猫();-这是隐式转换吗?

C# 动物thisIsACat=新猫();-这是隐式转换吗?,c#,.net,implicit-conversion,C#,.net,Implicit Conversion,举个例子: Animal thisIsACat=new Cat() 是否存在从Cat到Animal的隐式转换 如需澄清: 假设: class Animal { } class Cat: Animal { } 这只是一个例子 请注意,这是一种隐式转换(规范在§6.1.6中对其进行了定义),但不会改变被转换对象的参考标识 我必须假设Animal是一个接口(或抽象类)。数据类型Cat必须实现动物接口。。。是的,你有一个从newcat()到Animal的隐式转换。从动物到猫的转换必须明确:例如,

举个例子:

Animal thisIsACat=new Cat()

是否存在从
Cat
Animal
的隐式转换

如需澄清:

假设:

class Animal
{

}

class Cat: Animal
{

}
这只是一个例子


请注意,这是一种隐式转换(规范在§6.1.6中对其进行了定义),但不会改变被转换对象的参考标识

我必须假设
Animal
是一个接口(或抽象类)。数据类型Cat必须实现动物接口。。。是的,你有一个从
newcat()
到Animal的隐式转换。从动物到猫的转换必须明确:例如,
(猫)thisIsACat

继续阅读有关子类型多态性的资源,您将看到:可以追溯到20世纪60年代;它是在Simula衍生产品中引入的。1980年,约翰·C·雷诺兹(John C.Reynolds)和卢卡·卡德利(Luca Cardelli,1985)用范畴理论对子类型进行了第一次正式处理


具体来说,在本例中,我们有两种类型:动物和猫。Cat是Animal的一个子类型:类型转换、类型转换和强制是指隐式或显式地将一个数据类型的实体更改为另一个数据类型的不同方式

那里没有转换-您的对象是
Cat
,并且始终是
Cat
-只有变量列为
Animal
,不是对象本身

一个转换就是你拿一个
Cat
对象,对它做点什么,突然你有了一个不同类型的
Animal
对象。在这种情况下没有什么意义

在处理结构时,转换更有意义。
整数
5可以转换为
十进制
5m,它们是两个完全不同的对象

守则:

int i = 5;
decimal d = i;

这将是一个隐式转换,因为5是一个
系统.Int32
,但它被转换为5m,这是一个
系统.Decimal
,是一个与原始对象完全不同的对象。

@Jason:谢谢。在我发布了这个问题后,我想起了我以前见过的一些类似的东西。CLR只是假装它是一种动物,但没有转换。一个对象永远只能是一种类型,多态行为不会改变它的类型,CLR的行为就像它是一种类型。转换意味着您实际使用指定的任何转换算法创建特定类型的新对象。:-)我同意这是多态性的一个例子,但我确实在MSDN上发现了这样一个注意事项:从派生类到规范(§6.1.6)定义的基类有一个隐式引用转换,但请注意它们不会更改被转换对象的引用标识。我喜欢术语“子类型多态性”,但它仍然是从超类型到子类型的隐式转换@杰森:太棒了,谢谢你的“隐式引用转换”!这是“转换”的参考,对吗?当然是转换。转换不需要更改表示形式。保留表示的转换仍然是转换。我没有意识到引用转换会被视为转换。Convert这个词的实际用法,至少对我来说,是取一个对象并改变它,而不仅仅是改变引用。但我想这一切都取决于你的观点——在我看来,特定的Cat对象没有以任何方式改变或转换,只是对它的引用,而对象对我来说是重要的,而不是引用。但那只是我…好吧,假设你取一个包含数字123的int,然后把它转换成uint。这是不是一种转换?这些位完全相同。但是您可以对这些位执行的操作是不同的。这就是转化的原因;不是位不同,而是位的行为不同。在这种情况下,从实际的角度来看,
int
123和
uint
123是不同的对象-您可以通过对它们调用GetType()来验证这一点:
((uint)123)。GetType().Name
将为您提供UInt32,而
123.GetType().Name
将为您提供Int32。这显然是两个不同的目标。从技术上讲,当你开始谈论物理内存位置上的实际位时,可能不是这样——最终,一切都只是一系列位——但每天,它们都是不同的对象。再说一次,作为一名.NET开发人员,这只是一个对我来说有意义的观点。乔:但是值类型内部不包含任何描述其类型的信息!这是使值类型成为值类型的部分原因:它只包含其值的位,而不包含其元数据的位。当您对这些位调用“GetType”时,编译器生成的代码会告诉CLR“嘿,这个东西已经被转换为UINT,所以您需要将它视为一个装箱的UINT”。运行时引擎既不知道也不关心这些位的类型,除非编译器告诉它。