C# 当将派生类作为参数传递时,调试器是否应该抛出一些警告?

C# 当将派生类作为参数传递时,调试器是否应该抛出一些警告?,c#,inheritance,visual-studio-code,vscode-debugger,C#,Inheritance,Visual Studio Code,Vscode Debugger,我正在研究ASP.NET核心,我发现了一个关于继承的东西(因为IdentityUser可以由ApplicationUser派生) 下面是一个演示,解释它是什么: 实体: public class Animal { public string Name { get; set; } } public class Cat : Animal { // cat has no wings... } public class Eagle : Animal { public obje

我正在研究ASP.NET核心,我发现了一个关于继承的东西(因为
IdentityUser
可以由
ApplicationUser
派生)

下面是一个演示,解释它是什么:

实体:

public class Animal
{
    public string Name { get; set; }
}

public class Cat : Animal
{
    // cat has no wings...
}

public class Eagle : Animal
{
    public object LeftWing { get; set; }
    public object RightWing { get; set; }
}
数据库上下文(仅用于演示):

并使用它:

var cat = new Cat { Name = "Norris" };
var eagle = new Eagle { Name = "Voldemort", LeftWing = "good", RightWing = "broken" };

SaveChanges(cat);
SaveChanges(eagle);

// in asp.net core, this can be:
// public class ApplicationUser : IdentityUser {}

// _dbContext.Users.Add(new ApplicationUser { ExtensionProperty = "foo" });

// but we forgot to update the "Users" table 
// which refers to "ApplicationUser" class instead if "IdentityUser" class by default
// _dbContext.Users.Add(new IdentityUser());
因为猫没有翅膀,所以我们不需要添加左翼和右翼作为两个属性

此外,并非所有动物都有翅膀,因此它们不需要在表
动物
中定义

为了解决这个问题,我们可以创建两个表
Cats
Eagles

但在这篇文章中,我只想提到继承


什么时候爸爸可以被儿子取代,而儿子有两个翅膀,而爸爸没有?

不,不应该。您已经声明,您的方法只需要一只“动物”即可发挥作用

如果你需要了解翅膀等,那么你的合同可能是错误的


在这种情况下,也许animal就足够了,让ORM(如实体框架)来解决如何持久化它(即在单独的表中)。

您是在询问每种类型的表还是每种层次结构的表?对那些有关键词实体框架的人进行搜索,有足够的材料来回答你的问题(我想)。如果不改写你的问题,因为你(对我)问的根本不清楚。@Igor-Oh。我很抱歉。我的意思是,当我试图用表中未定义的一些扩展属性更新数据库时。调试器不会对此发出任何警告。这仍然是有效的行动。
那么也许你的合同是错误的?
。是的,你知道我的意思,谢谢!但是由于
Cat
Eagle
都是从
Animal
派生出来的,因此我没有收到任何警告/错误消息,因为继承关系。我不希望您收到警告!您选择Animal作为方法参数类型。你的方法应该适用于动物!如果没有,那么您需要更改您的方法签名。通过在签名中添加动物,您已经形成了一份合同,并向消费者声明您可以处理所有衍生动物。
var cat = new Cat { Name = "Norris" };
var eagle = new Eagle { Name = "Voldemort", LeftWing = "good", RightWing = "broken" };

SaveChanges(cat);
SaveChanges(eagle);

// in asp.net core, this can be:
// public class ApplicationUser : IdentityUser {}

// _dbContext.Users.Add(new ApplicationUser { ExtensionProperty = "foo" });

// but we forgot to update the "Users" table 
// which refers to "ApplicationUser" class instead if "IdentityUser" class by default
// _dbContext.Users.Add(new IdentityUser());