【问题标题】:Is there a way to tell ReSharper that a method never returns null if a specific flag is passed as a parameter?如果将特定标志作为参数传递,有没有办法告诉 ReSharper 方法永远不会返回 null?
【发布时间】:2019-12-01 03:44:25
【问题描述】:

框架提供了一些可以返回null的方法。如果之前没有进行空检查,ReSharper 通常会通过警告告诉您这是 Possible 'System.NullReferenceException'

一个例子是Type.GetType()。这个方法只需要一个字符串作为参数,它是类型名称并返回相应的Type。如果找不到类型,则返回 null。这是 ReSharper 通知可能的 NullReferenceException 的示例。

但是这个方法有另一个重载,它需要另一个名为 throwOnNull 的布尔参数。如果设置为 true,来自 ReSharper 的警告将消失。

有没有办法在我自己的库中实现这种机制?我们在HttpContext 上有一个包含一些扩展方法的库。其中一些扩展方法可以返回 null。

【问题讨论】:

  • 我不确定这是否是硬编码的知识。但是您可以使用 [NotNull][CanBeNull] 告诉 resharper 预期的行为。有关更多信息,请参阅here。但我没有看到添加 [CanBeNull] 有任何限制的解决方案。

标签: c# resharper


【解决方案1】:

您可以使用JetBrains.AnnotationsContractAnnotation 属性来做到这一点。

使用您提供的示例。给定以下类:

public class MyType
{
    [ContractAnnotation("throwOnNull:true => notnull")]
    public static Type GetType(string name, bool throwOnNull)
    {
        return null;
    }
}

ReSharper 会将以下内容标记为Possible System.NullReferenceException

var type = MyType.GetType("Some.Type", false);
var typeName = type.FullName;

虽然没关系:

var type = MyType.GetType("Some.Type", true);
var typeName = type.FullName;

【讨论】:

    猜你喜欢
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2013-07-15
    • 1970-01-01
    • 2019-07-30
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多