[英]Why downcasting is not allowed in C#?
我有 2 个名为EventDto
和EventWithObjectsDto
的类。 EventDto
是父 class 和EventWithObjectsDto
继承自它。 这些是类:
public class EventDto : BaseDto
{
public EventTypes Type { get; set; }
public string Title { get; set; }
public DateTime StartAt { get; set; }
public DateTime EndAt { get; set; }
public Guid? RecursiveCriteriaId { get; set; }
}
public class EventWithObjectsDto : EventDto
{
public List<ObjectDto> Objects { get; set; }
}
我想将EventDto
为EventWithObjectsDto
,所以我尝试了两种方法: var eventWithObjects = (EventWithObjectsDto)ev;
抛出InvalidCastException
和var eventWithObjects = ev as EventWithObjectsDto
返回null
。 唯一: EventDto
的方法是从 EventWithObjectsDto 中删除EventWithObjectsDto
并使用 AutoMapper 到 map EventDto
到EventWithObjectsDto
但我不想使用 AutoMapper 存在另一种方式。
另外,我做了一个简单的测试:
var simpleEvent = new EventDto();
// Thrown InvalidCastException
var simpleEventWithObjects = (EventWithObjectsDto)simpleEvent;
有人能帮我吗?
被强制转换的object必须是EventWithObjectsDto
类型(或派生类型)。
这里有一个小片段来证明如果是演员阵容将是一个成功的Event 。
var a = new EventWithObjectsDto {Type = "Tip"};
EventDto b = a;
var c = (EventWithObjectsDto) b;
Console.WriteLine(c.Type);
Output 是:
Tip
EventDto
EventWithObjectsDto
While you cannot cast an object of class EventDto
to EventWithObjectsDto
, you can always create an object of derived type from an object of the parent type.
class EventWithObjectsDto {
...
public EventWithObjectsDto(EventDto e ){(...)}
}
(...)
var simpleEvent = new EventDto();
var simpleEventWithObjects = new EventWithObjectsDto(simpleEvent);
这是一份相关的注释表格ECMA-334 第 5 版/2017 年 12 月 C# 语言规范。
隐式或显式引用转换永远不会更改正在转换的 object 的引用标识。 [注意:换句话说,虽然引用转换可以改变引用的类型,但它永远不会改变被引用的 object 的类型或值。 尾注]
您不能将EventDto
为EventWithObjectsDto
。
因为在OOP理论中, EventDto
是泛化类型, EventWithObjectsDto
是特化类型。
您可以将EventWithObjectsDto
为EventDto
,因为EventWithObjectsDto
大于EventDto
:它包括所有EventDto
操作和变量。
您不能将EventDto
为EventWithObjectsDto
因为EventDto
小于EventWithObjectsDto
:它不包括所有EventWithObjectsDto
操作和变量。
就像当猫是动物时你想说所有动物都是猫一样:你不能,这是错误的。 猫是动物,但并非所有动物都不是猫。
所以你有一个类型不匹配。
您所能做的就是使用一种模式,通过检查哪些变量是常见的(名称和类型),在父 class 的实例中复制具有子 class 实例的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.