当前位置: 首页 > 编程语言 > C#

标记为Obsolete的接口方法在实现时不会从编译器发出消息分享

时间:2023-04-11 01:09:36 C#

C#学习教程:标记为Obsolete的接口方法在实现时不会从编译器发送消息不再吃东西了”,真的)]voidEat();}公共类动物:IAnimal{publicvoidEat(){Console.WriteLine("Hello");我有一个带有弃用方法的接口IAnimal。Animal类实现了这个接口。后来,我调用Eat方法:varanimal=newAnimal();动物.吃();编译器无法编译(我已将Obsolete标记为给出错误而不是警告)。程序编译和调用该方法没有错误。据我所知,这是一个编译器错误。我错过了什么吗?注意:我使用的是VS2010你只将IAnimal.Eat标记为过时,而不是Animal.Eat。var关键字解析为Animal,因此当您调用animal.Eat时,您不会调用任何标记为Obsolete的方法。要解决这个问题,要么将var显式更改为IAnimal,要么更好,将Animal.Eat标记为过时:}publicclassAnimal:IAnimal{[Obsolete("Animalscan'teatanymore",true)]publicvoidEat(){Console.WriteLine("Hello");看起来这种行为是因为你的varanimal是AnAnimal,其中Eat方法没有过时。如果你这样做:IAnimalanimal=newAnimal();动物.吃();你应该看到你期望的警告/错误。编译器不会警告接口中的过时方法,只会针对方法调用发出警告。这样做有充分的理由:您始终可以将您的方法命名为Eat您始终可以实现EatonAnimal方法,无论它是否也出现在其中一个接口中并被标记为过时。例如,如果:publicclassAnimal{publicvoidEat(){/*...*/}}被允许:publicclassAnimal:IAnimal{publicvoidEat(){/*...*/}}必须实现所有接口方法您需要实现接口中存在的所有方法。你不能跳过它们中的任何一个,即使它们已经过时了。例如,如果不添加Eat,则不会实现接口的所有成员,并且会出现其他错误:publicclassAnimal:IAnimal{//NoEat()}'Animal'doesnotimplementinterfacemember'IAnimal.Eat()'以上是C#学习教程:标记为Obsolete的接口方法在实现时不会从编译器发送消息。多多关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: