C# - ;预期在 Throw New Exception 错误中使用 Assert

C# - ; expected in Throw New Excepction error using Assert

我在 C# 项目中使用此代码

public async Task should_not_raise_exception(Mock<IWebSocketClient> webSocket, SlackConnection slackConnection)
    {
        // given
        var connectionInfo = new ConnectionInformation
        {
            WebSocket = webSocket.Object
        };
        await slackConnection.Initialise(connectionInfo);

        var inboundMessage = new ChatMessage
        {
            MessageType = MessageType.Message,
            User = "lalala"
        };

        slackConnection.OnMessageReceived += message => throw new Exception("EMPORER OF THE WORLD");

        // when & then
        Assert.DoesNotThrow(() => webSocket.Raise(x => x.OnMessage += null, null, inboundMessage));
    }

但是当我编译它时,这显示了一个关于 ; 的错误。预期,关于错误的代码部分是这样的:

slackConnection.OnMessageReceived += message => throw new Exception("EMPORER OF THE WORLD");

        // when & then
        Assert.DoesNotThrow(() => webSocket.Raise(x => x.OnMessage += null, null, inboundMessage));

我正在使用框架 4.6.1

查看附件图片

您只需使用这行代码即可重现该问题:

Action<string> foo = message => throw new Exception();

问题是在 C# 7.0 之前,您不能将 throw 用作表达式本身...而这正是表达式主体 lambda 表达式必须具备的。

该行代码在 C# 7 中有效,但在 C# 6 或更早版本中无效。您使用的是哪个版本的框架并不重要,重要的是您使用的是哪个 C# 编译器。

您可以改用语句 lambda(基本上是使用大括号的 lambda 表达式)来修复您的代码:

slackConnection.OnMessageReceived +=
    message => { throw new Exception("EMPORER OF THE WORLD"); };

...或者您可以升级到使用 C# 7 :)(例如,通过更新到 VS 2017。)