首页 > 解决方案 > 抽象类转换问题

问题描述

我有这个代码:

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

public class Dog : Animal
{
    [JsonProperty("name")]
    public new string Name { get; set; }
}

public static void Main()
{
    var dog = new Dog
    {
        Name = "Spark"
    };

    Console.WriteLine(dog.Name);
    Console.WriteLine(((Animal)dog).Name == null);
}

这将输出:

Spark
True

为什么将Name属性null转换为Animal

如果我想将我的对象投射到 ,如何解决它Animal?如何保持属性值?

标签: c#abstract-class

解决方案


您所期望的由 实现override,因此您必须覆盖属性:

public override string Name { get; set; }

但是为了做到这一点,你需要将该属性标记为abstract,否则你会得到一个错误:

错误 CS0506:“Dog.Name”:无法覆盖继承的成员“Animal.Name”,因为它未标记为虚拟、抽象或覆盖

参考这篇文章。在那里你可以阅读:

override 修饰符可以用在虚方法上,而且必须用在抽象方法上。这表明编译器使用方法的最后定义实现。即使在对基类的引用上调用该方法,它也会使用覆盖它的实现。


推荐阅读