C# - Невозможно использовать оператор "is" в лямбда-выражении - PullRequest
1 голос
/ 10 марта 2020

Я использую AgileMapper с этим кодом:

source.Map().OnTo(target, (options) =>
  options.IgnoreSources((options) =>
    options.If((value) =>  value is null)
  )
);

Однако компилятор жалуется:

Дерево выражений может не содержать сопоставления с шаблоном выражения "is"

Это работает, если я использую value == null, но я хочу понять, почему is не работает?

1 Ответ

14 голосов
/ 10 марта 2020

value is null использует постоянный шаблон. Сопоставление с образцом было введено в C# 7, задолго после деревьев выражений, и не может (в настоящее время) использоваться в деревьях выражений. Возможно, что это будет реализовано в какой-то момент, но на данный момент это недействительно. Обратите внимание, что это только для деревьев выражений, а не лямбда-выражений, которые преобразуются в делегаты. Например:

using System;
using System.Linq.Expressions;

class Program
{
    static void Main()
    {
        object x = null;
        Func<bool> func = () => x is null; // Fine
        Expression<Func<bool>> expression = () => x is null; // CS8122
    }
}

Существуют различные ограничения кода в деревьях выражений. Например, вы не можете использовать операции Dynami c или литералы кортежей. Ограничение на сопоставление с образцом является еще одним примером этого.

...