抽象类强制转换问题



我有这个代码:

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属性在转换为Animalnull

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

你期望的东西是由override实现的,所以你必须覆盖属性:

public override string Name { get; set; }

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

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

请参阅此帖子。在那里你可以读到:

重写修饰符可用于虚拟方法,并且必须用于抽象方法。这指示编译器使用方法的最后一个定义的实现。即使该方法是在对基类的引用上调用的,它也将使用重写它的实现。

public class Dog : Animal
{
string name = null;
public new string Name { get { return name; } set { name = value; base.Name = name; } } }
}

最新更新