【问题标题】:C# ternary operator not workingC# 三元运算符不起作用
【发布时间】:2016-09-15 04:12:35
【问题描述】:

我有一个类的 Moq 模拟,我需要验证是否调用了某个方法。根据变量的类型,我需要检查该方法是被调用过一次还是从不被调用。

所以,这行得通:

if (exception is ValidationException)
    mockRequestHandler.Verify(x => x.HandleException(exception), 
    Times.Once);
else
    mockRequestHandler.Verify(x => x.HandleException(exception), 
    Times.Never);

我正在尝试如下使用三元运算符,但它似乎不起作用:

mockRequestHandler.Verify(x => x.HandleException(exception),
    (exception is ValidationException) ? Times.Once: Times.Never);

我收到以下编译时错误:

无法确定条件表达式的类型,因为“方法组”和“方法组”之间没有隐式转换。

有什么简单的我忽略了还是不能以这种方式使用三元运算符?

【问题讨论】:

  • 为什么不把异常检查放在第一位呢?例如。 (exception is ValidationException) ? mockRequestHandler.Verify(x => x.HandleException(exception), Times.Once) : mockRequestHandler.Verify(x => x.HandleException(exception), Times.Never);。它看起来几乎和你原来的一样长,但请参考这个链接:Using conditional (?:) operator for method selection in C# (3.0)?
  • 能否指定VerifyTimes.OnceTimes.Never 的类型签名?
  • 您应该能够将其中一个操作数转换为 Func 来解决它

标签: c# moq ternary-operator


【解决方案1】:

正如我在this source file 中看到的,Times.OnceTimes.Never 实际上是静态方法,而不是属性。

为了验证方法是被调用一次还是从不被调用,你需要这样使用它:

mockRequestHandler.Verify(x => x.HandleException(exception), Times.Once());
mockRequestHandler.Verify(x => x.HandleException(exception), Times.Never());

因此,使用三元运算符将是:

mockRequestHandler.Verify(x => x.HandleException(exception), 
    (exception is ValidationException) ? Times.Once() : Times.Never());

【讨论】:

  • 这可能是针对起订量案例的错误建议。检查验证第二个参数的类型以确认
  • @AlexeiLevenkov 感谢您的建议。我从未使用过 Moq,但我在 GitHub 和 here 上看到了这种用法。如果 OP 尝试了这个并且它不起作用,我将删除我的答案:)
  • 首先,谢谢,这个答案有效。但是,我最初的用法mockRequestHandler.Verify(x => x.HandleException(exception), Times.Once);(方法组......没有括号)工作正常。当作为方法调用时它也可以工作(带括号)。
  • @AlexeiLevenkov 在this source file 中,您会看到两个重载允许这两种语法。事实上,一个人打电话给另一个人:public void Verify(Expression<Action<T>> expression, Times times) { /* ... */ },然后是public void Verify(Expression<Action<T>> expression, Func<Times> times) { Verify(expression, times()); }
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2012-04-02
  • 2018-12-28
  • 2011-08-30
  • 1970-01-01
  • 2011-03-16
相关资源
最近更新 更多