C# ; expected in Throw New Excepction error using Assert

Im using this code in C# project

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));
    }

But when I compile it, this shows me an error about ; expected, the code part about error is this:

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

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

I'm using framework 4.6.1

Check the attached image

Image

Jon Skeet
people
quotationmark

You can reproduce the problem with just this line of code:

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

The problem is that before C# 7.0, you couldn't use throw as an expression on its own... and that's what an expression-bodied lambda expression has to have.

That line of code is valid in C# 7, but not in C# 6 or earlier. It doesn't matter which version of the framework you're using - it matters which C# compiler you're using.

You can fix your code just by using a statement lambda (basically, a lambda expression that uses braces) instead:

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

... or you could upgrade to use C# 7 :) (For example, by updating to VS 2017.)

people

See more on this question at Stackoverflow