ReSharper警告:基类[NotNull]派生类属性[CanBeNull]冲突

时间:2017-07-13 21:45:11

标签: c# override resharper nullable

考虑以下C#.Net代码:

using System.Xml;

internal class MyXmlReaderClass : XmlReader
{
    private readonly XmlReader _innerReader;

    public MyXmlReaderClass(...other_parameters... , XmlReader innerReader)
    {
        _innerReader = innerReader;
    }
    //... lots of code has been left out, here ...

    public override string LocalName
    {
        get { return _innerReader.LocalName; }
    }
    //... lots more code has been left out, here ... 
}

在属性LocalName中,ReSharper在类型string下放置一个下划线,警告,'string'是(显式​​或隐式)[NotNull]

我认为我理解了关于可以为空的对象的游戏概念。我已经能够从我的代码中重构大部分这些问题,除非在这种情况下。

如果我正确理解了我的世界,那么基类(XmlReader)就是ReSharper标识为[NotNull]的东西。这意味着ReSharper认为我对属性的覆盖可能会返回null,而base永远不会返回null。

我很难理解如何使用某种覆盖覆盖基类属性LocalName,这样基类和派生类之间的属性就不会发生冲突。

我的问题是多部分,“ReSharper究竟识别出什么,以及如何解决不一致问题?”

是的,我通过StackOverflow搜索了高低,并使用了Google但却找不到这个具体的例子。

谢谢。

1 个答案:

答案 0 :(得分:3)

这不是ReSharper警告,而是"type highlighting" of the Implicit Nullability extension

  

ReSharper到底确定了什么?

突出显示通知您的成员的返回类型是隐式[NotNull],因为基本成员是[NotNull]。

由于ReSharper提供了External Annotation,基本成员XmlReader.LocalName为[NotNull]。

  

如何解决不一致问题?

您无需修复它,因为它不是警告/建议。这只是一个亮点。

如果您不喜欢此突出显示,可以在隐式可为空性页面的R#选项中禁用它。