繁体   English   中英

为什么 C# 中不允许向下转换?

[英]Why downcasting is not allowed in C#?

我有 2 个名为EventDtoEventWithObjectsDto的类。 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; }
}

我想将EventDtoEventWithObjectsDto ,所以我尝试了两种方法: var eventWithObjects = (EventWithObjectsDto)ev; 抛出InvalidCastExceptionvar eventWithObjects = ev as EventWithObjectsDto返回null 唯一: EventDto的方法是从 EventWithObjectsDto 中删除EventWithObjectsDto并使用 AutoMapper 到 map EventDtoEventWithObjectsDto但我不想使用 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 的类型或值。 尾注]

您不能将EventDtoEventWithObjectsDto

因为在OOP理论中, EventDto泛化类型, EventWithObjectsDto化类型。

您可以将EventWithObjectsDtoEventDto ,因为EventWithObjectsDto大于EventDto :它包括所有EventDto操作和变量。

您不能将EventDtoEventWithObjectsDto因为EventDto小于EventWithObjectsDto :它不包括所有EventWithObjectsDto操作和变量。

就像当猫是动物时你想说所有动物都是猫一样:你不能,这是错误的。 猫是动物,但并非所有动物都不是猫。

所以你有一个类型不匹配。

泛化、专业化和 Inheritance

泛化和专业化 - 有什么区别

C# 中的向上转换和向下转换

什么是多态性

您所能做的就是使用一种模式,通过检查哪些变量是常见的(名称和类型),在父 class 的实例中复制具有子 class 实例的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM