我有这个代码:
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
属性在转换为Animal
时null
?
如果我想将我的对象投射到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; } } }
}