【问题标题】:Custom null assertion in JetBrains RiderJetBrains Rider 中的自定义空断言
【发布时间】:2019-08-30 05:57:59
【问题描述】:

我有一个自定义扩展方法来检查Guid? 值:

public static bool IsNullOrDefault(this Guid? guid)
{
    return !guid.HasValue || guid.value == Guid.Empty;
}

当我在代码中使用该方法时,我希望 Rider 会在可能的 System.InvalidOperationException 断言中考虑该方法。但事实并非如此。

public void Foo(Guid? guid)
{
    if (guid.IsNullOrDefault())
    {
        throw new Exception();
    }

    var x = guid.Value;
            ^ There is still a yellow squiggle here, saying Possible System.InvalidOperationException
    ...
}

我尝试通过覆盖自定义(语句)模式来创建自己的空值检查模式:

if ($EXPR$.IsNullOrDefault()) throw new System.ArgumentNullException($NAME$);

但这也不起作用。如何配置 Rider 以将我的自定义方法视为等同于 guid.HasValueguid != null

【问题讨论】:

  • 如果您使用guid == null 而不是!guid.HasValue,它的行为是否符合您的预期?
  • @mjwills guid == null 没有帮助。我必须先检查注释......但我有一些担忧,因为团队的一部分仍在使用 Visual Studio,他们可能缺少 JetBrains 注释程序集。

标签: c# .net-core rider


【解决方案1】:

我不确定 Rider 是否足够聪明,能够识别出您已经检查过这个。 我认为您可以做的是使用?. 符号来检查null

var x = guid?.Value;

在评估.value 之前检查guid 是否为null,如果是,则返回null

然后你可以把支票放在后面,所以它结束了

var x guid?.value;
if(x is null)
    Throw new Exception();

或者你可以返回一个默认值而不是抛出一个异常,你的调用。

让我知道它是如何工作的!

【讨论】:

  • 很抱歉,但这违背了使用自定义扩展方法进行空值检查的全部目的。
  • 你还不能用吗?代替我建议的if(x is null),你可以写你的if(guid.IsNullOrDefault()),它的行为方式是一样的。或者,您可以使用 var x = guid?.Value; 修改原始示例,它会消失。
  • 这不是问题的答案!我刚刚用谷歌搜索“骑手添加自定义空检查”并得到了这个问题。这也是我的问题。但你没有回答这个问题。投反对票。
猜你喜欢
  • 2019-01-06
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
相关资源
最近更新 更多