Выражение переключателя в функции Azure вызывает исключение
Написание функции C# Azure и попытка использовать выражения переключателя C#8.
Согласно документам https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.switchexpressionexception?view=netcore-3.1, они показывают, что это должно быть доступно для.net core 3.1
Этот код, использующий выражение switch, не работает:
try
{
var data = (JObject)eventGridEvent.Data;
IDHT22 sensor = eventGridEvent.EventType switch
{
"TemperatureChangedEvent" => new TemperatureSensorEvent(data["sensor_id"].Value<string>(), data["name"].Value<string>(), data["temperature_c"].Value<double>()),
"HumidityChangedEvent" => new HumiditySensorEvent(data["sensor_id"].Value<string>(), data["name"].Value<string>(), data["humidity"].Value<double>())
};
if (sensor != null)
await sensors.AddAsync(sensor);
}
catch (System.Exception ex)
{
throw new InvalidOperationException(ex.Message, ex);
}
При выполнении это приводит к этому сообщению об ошибке:
[30.04.2020 19:21:06] Выполнено 'SaveSensorEvent' (Failed, Id=8db720e1-aa19-4f53-b102-3aaa83f19667) [30.04.2020 19:21:06 PM] System.Private.CoreLib: Исключение при выполнении функции: SaveSensorEvent. > SensorData: не удалось загрузить тип System.Runtime.CompilerServices.SwitchExpressionException из сборки System.Runtime.Extensions, Version=4.2.1.0, Culture= нейтральный, PublicKeyToken=b03f5f7f11d50a3a.
Если я использую традиционный переключатель, все хорошо. Кажется, мне может потребоваться обновить Runtime.Extensions, хотя я не знаю, как это сделать в приложении ядра.net.
Есть идеи?
1 ответ
По-видимому, в вашем коде отсутствует регистр по умолчанию.
Должно получиться так:
IDHT22 sensor = eventGridEvent.EventType switch
{
"TemperatureChangedEvent" => new TemperatureSensorEvent(data["sensor_id"].Value<string>(), data["name"].Value<string>(), data["temperature_c"].Value<double>()),
"HumidityChangedEvent" => new HumiditySensorEvent(data["sensor_id"].Value<string>(), data["name"].Value<string>(), data["humidity"].Value<double>()),
_ => balabala
};