Resharper如何知道“表达总是如此”?

时间:2011-02-21 15:31:06

标签: c# resharper

查看以下代码:

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

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

Resharper声明type永远不会是null。这对我来说很明显,因为bar总会有一种类型,但Resharper如何知道呢?怎么知道方法的结果永远不会是null

Type不是结构,所以它不可能。如果方法是由我编写的,那么返回值当然可以是null(不一定是GetType,而是其他东西)。

Resharper是否足够聪明,只知道该特定方法的结果永远不会是null? (就像有一个已知的.Net方法的硬编码列表,它永远不会返回null)

4 个答案:

答案 0 :(得分:13)

JetBrains完美地解释了ReSharper如何在features list中完成此任务。

链接摘要(此特定问题与NotNullAttribute相关):

  

我们分析了.NET Framework类库以及NUnit Framework的很大一部分,并使用JetBrains.Annotations命名空间中的一组自定义属性,通过外部XML文件对其进行了注释,具体为:

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)

答案 1 :(得分:6)

是的,它基本上了解一些众所周知的方法。您也应该为字符串连接找到相同的内容,例如:

string x = null;
string y = null;
string z = x + y;

if (z == null)
{
    // ReSharper should warn about this never executing
}

现在相同的信息可通过代码合同获得 - 我不知道JetBrains是否直接挂钩此信息,有自己的数据库,还是两者的混合。

答案 2 :(得分:1)

GetType不是virtual。您的假设很可能在您的上一次陈述中是正确的。

编辑:回答您的评论问题 - 无法用开箱即用的方法推断出来。

答案 3 :(得分:0)

object.GetType不是虚拟的,因此您无法自己实现返回空值的版本。因此,如果bar为空,您将获得NullReferenceException,否则,type将永远不会为空。