接口已声明异常,实现类是否仍需重复编写异常文档?
这个问题我之前也碰到过,咱们一步步拆解来看:
首先明确说:这不是你的问题,是ReSharper默认的静态分析规则导致的,你完全不需要手动重新声明接口里的异常。
为什么会出现这个警告?
ReSharper的文档检查逻辑,默认会要求公开方法的所有异常信息都在自身的XML注释里显式体现——哪怕这些异常已经在接口的方法文档中定义了。它的出发点是希望每个方法的文档都能“自给自足”,让开发者查看实现类的方法时,不用跳转到接口就能获取全部契约信息,但这其实是一种风格层面的建议,而非C#语言的强制要求。
你提到通过CTRL+Q能看到继承的接口异常文档,这说明ReSharper本身是能识别到接口文档的,只是它的规则默认要求你在实现类里也重复写一遍。
解决方法有两种,按需选择:
方法一:调整ReSharper规则,关闭这个警告
打开ReSharper设置(ReSharper > Options),依次导航到:Code Inspection > Inspection Severity > C# > Documentation Issues > Missing XML comment for implicitly documented exception
把这个规则的严重程度改成「不显示」或者「提示」(根据你的代码风格偏好),之后就不会再收到这个冗余警告了。方法二:快速复制接口文档到实现类
如果你想保留规则但不想手动重复编写注释,把光标定位到警告的MoveForward方法上,按Alt+Enter,选择「Copy XML documentation from base」选项,ReSharper会自动把接口里的异常注释(包括summary部分)复制到实现类的方法上,最终代码会变成这样:public class MyService : IMyService { /// <summary> /// ... /// </summary> /// <exception cref="CantMoveForwardException"> /// If <see cref="IMyService.CanMoveForward"/> returns <see langword="false" />. /// </exception> public void MoveForward() { } }
额外补充:从C#规范角度看
按照C#的语言契约,接口方法定义的异常已经约束了所有实现类的行为——只要你的实现类遵循接口约定抛出CantMoveForwardException,就完全符合规范,不需要在实现类中重复声明异常。ReSharper的警告只是它的代码风格建议,不是必须遵守的规则。
内容的提问来源于stack exchange,提问作者ChristmasAnon

