How Does Resharper Know “Expression is always true”?

倖福魔咒の 提交于 2019-11-28 13:21:45
Matthew Ferreira

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)

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.

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.

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.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!