How Does Resharper Know “Expression is always true”?

前端 未结 4 1399
既然无缘
既然无缘 2020-12-11 15:41

Check out the following code:

private void Foo(object bar)
{
   Type type = bar.GetType();

    if (type != null) // Expression is always true
    {   
    }         


        
相关标签:
4条回答
  • 2020-12-11 16:02

    object.GetType is not virtual, so you cannot yourself implement a version that returns a null value. Therefore, if bar is null, you will get a NullReferenceException and otherwise, type will never by null.

    0 讨论(0)
  • 2020-12-11 16:07

    Yes, it basically has knowledge of some well-known methods. You should find the same for string concatenation too, for example:

    string x = null;
    string y = null;
    string z = x + y;
    
    if (z == null)
    {
        // ReSharper should warn about this never executing
    }
    

    Now the same information is also becoming available via Code Contracts - I don't know whether JetBrains is hooking directly into this information, has its own database, or a mixture of the two.

    0 讨论(0)
  • 2020-12-11 16:12

    JetBrains perfectly explains how ReSharper does this in their features list.

    Summary from link (this particular question is about NotNullAttribute):

    We have analyzed a great share of .NET Framework Class Library, as well as NUnit Framework, and annotated it through external XML files, using a set of custom attributes from the JetBrains.Annotations namespace, specifically:

    StringFormatMethodAttribute (for methods that take format strings as parameters)
    InvokerParameterNameAttribute (for methods with string literal arguments that should match one of caller parameters)
    AssertionMethodAttribute (for assertion methods)
    AssertionConditionAttribute (for condition parameters of assertion methods)
    TerminatesProgramAttribute (for methods that terminate control flow)
    CanBeNullAttribute (for values that can be null)
    NotNullAttribute (for values that can not be null)
    UsedImplicitlyAttribute (for entities that should not be marked as unused)
    MeansImplicitUseAttribute (for extending semantics of any other attribute to mean that the corresponding entity should not be marked as unused)
    
    0 讨论(0)
  • 2020-12-11 16:18

    GetType is not virtual. Your assumption is most likely correct in your last statement.

    Edit: to answer your comment question - it can't infer with your methods out of the box.

    0 讨论(0)
提交回复
热议问题