【问题标题】:C#: throw invalid expression compilationC#:抛出无效的表达式编译
【发布时间】:2018-04-19 18:10:21
【问题描述】:

我正在使用此代码来检查 queryable 值:

visitor.Queryable = queryable ?? throw new Exception("error message");

我收到编译错误:

错误 CS1525:无效的表达式术语 'throw'

我正在使用 4.5.2 .net 框架。 有什么想法吗?

【问题讨论】:

  • 在你正在使用的 VS 和 C# 中提及它会很有用
  • throw 不返回值,在早于 C#7 的编译器上,?? 不支持该值
  • @RufusL:没关系;这是有效的 C# 7 代码,但不适用于其他版本。
  • 您所针对的框架版本无关紧要。您使用的编译器版本非常多。如果您使用的是 C# 7 编译器,这应该没问题。如果您使用的是 C# 6 或更早版本,则不会。

标签: c#


【解决方案1】:

此功能仅在 C# 7.0 之后可用。请参阅Throw exception of What's New in C# 7.0

如果您使用的是旧版 VS 并希望启用 C# 7 功能:如果不在 VS 2017 中,请查看 How to use c#7 with Visual Studio 2015?


如果您使用的是以前版本的 C# 编译器,因为您一定是由于错误,那么您不能以这种方式使用 ?? 运算符,因为 throw 不会返回正确的操作数值。正如C# Docs 所说:

如果操作数不为空,则返回左侧操作数;否则返回正确的操作数。

图案是这样的:

var result = someObject ?? valueToAssignIfWasNull;

改为解决它:

if(queryable == null)
{
    throw new Exception("error message");
}
visitor.Queryable = queryable;

【讨论】:

  • 我以为我在C# 7.1的某处看到了
  • @RandRandom - 可能 OP 没有使用 VS 2017 :)
  • 我认为他应该避免这样做,反正
  • @MarcoSalerno - 不会真的这么说...如果它作为 C# 7.0 的有效编译选项添加到语言中,那么我想有足够的理由这样做:) 我同意的是,这是个人喜好。
  • 是的,正如我所说的“我认为”,我发现它的语法不清楚
【解决方案2】:

我赞成接受,但我也会提出一个解决方法:

private Queryable NullAlternative()
{
    throw new ArgumentNullException("Null Queryable not supported at this time.");
}

然后,在其他地方,你可以说

visitor.Queryable = queryable ?? NullAlternative();

如果你不能升级到 VS2017 但又不想失去光滑的条件语法,这很好,而且它还有一个额外的好处是在将来让它对某种空对象模式开放(例如初始化一个空的可查询)。

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多