【问题标题】:Why is wrong this inline if?为什么这个内联是错误的?
【发布时间】:2013-11-22 10:39:41
【问题描述】:

如果有以下语句:

return this.revision.HasValue ? this.revision : throw new InvalidOperationException();

我认为它会编译,因为 throw 破坏了正常流程,不返回值但它不构建应该不是问题。

有没有办法纠正这种说法,或者为什么不允许这样做?

谢谢。

编辑: this.revision 是 int 吗?并且该方法返回 int。

编辑2:如果我有这个方法

public int Test()
{
    throw new Exception();
}

编译器不会抱怨没有返回一个值,我期望内联中的同样的事情 if ... 至少我们知道可以做到,因为它已经在方法中完成了。

【问题讨论】:

  • 你方法的返回类型是什么?
  • 来自 msdn:first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。 msdn.microsoft.com/en-us/library/ty67wk28(v=vs.110).aspx
  • 提供您的 (visual studio) 错误消息。乍一看,修订版!=异常。
  • 添加了请求的信息,谢谢。
  • throw 不是类型,条件运算符也不是if-else

标签: c# .net exception iif cls


【解决方案1】:

将评论转换为答案:

来自 MSDN:

first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

?: Operator

由于int? 无法转换为异常,并且 throw 不是表达式,因此代码中存在错误。

【讨论】:

  • “我预计计算机会违反它的编程并读懂我的想法。请帮助,互联网。”
  • @SoMoS:编译器很聪明,但它必须遵循规则,其中一条规则是语法必须有效。如果您使用条件运算符,则规则很严格。如果你不喜欢它,你必须使用if-else
  • @Ric: "int? 无法转换为异常,因此您的代码中出现错误" 即使它可以转换为异常,代码也将无效,因为throw 不是异常类型,throw 在条件运算符中是不允许的。
  • 作为整数?无法转换为异常 -> 错误,这根本不是原因。如果 OP 改用异常,它也不起作用。
  • @Ric 这不是类型不匹配,只是throw 不是表达式。
【解决方案2】:

我想问题在于 this.revision 是一个可为空的类型,而 InvalidOperationException() 是一个 SystemException。在 if 语句中不能有两种不同的类型,例如:

return (a>b)? DateTime.Now : 2;

请看这里:http://msdn.microsoft.com/en-us/library/vstudio/ty67wk28.aspx

条件?第一个表达式:第二个表达式;

条件必须评估为真或假。如果条件为真,则计算 first_expression 并成为结果。如果条件为假,则计算 second_expression 并成为结果。仅计算两个表达式中的一个。

first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换。

【讨论】:

【解决方案3】:

这是因为在ternary expression 中,后两个表达式可以相互替代,并且它们的返回值需要具有相同的类型或隐式转换为所分配变量的类型。
显然,Exception 的类型与 int 不同。

MSDN:

如果条件为假,second_expression 被求值并成为结果

【讨论】:

    【解决方案4】:

    这是因为?: 的第二个操作数需要是表达式,而不是 throw 语句。

    所以你能做的是-

    public static T ThrowException<T>()
    {
        throw new Exception();
    }
    

    并在你的陈述中使用它

    return this.revision.HasValue ? this.revision :ThrowException<bool>();
    

    【讨论】:

      【解决方案5】:

      C# 编译器可以做到这一点,它可以做比现在更多的事情。问题是编写功能然后支持它的成本。请参阅 Eric Gunnerson's blog post 概述新功能决策过程。

      【讨论】:

        猜你喜欢
        • 2020-12-09
        • 1970-01-01
        • 2018-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多