Код: Выделить всё
internal static class Program
{
private static void Main()
{
object value = "Hello";
Console.WriteLine(value.Test(o => o is string));
}
private static bool Test(this T value, Expression test) =>
test.Compile().Invoke(value);
}
Верно
Теперь сравните с этим кодом:
Код: Выделить всё
internal static class Program
{
private static void Main()
{
string? value = "Hello";
Console.WriteLine(value.Test(o => o is null)); // Compiler error
}
private static bool Test(this T value, Expression test) =>
test.Compile().Invoke(value);
}
Дерево выражений не может содержать соответствующее шаблону выражение «is».
Мне любопытно, почему последний код выдает указанную выше ошибку компилятора, а первый - нет, хотя он тоже является выражением 'is', соответствующим шаблону; т. е. почему сопоставление типов разрешено, а совпадение значений NULL — нет?
Примечание: я знаю, что могу использовать Func вместо Expression но это выходит за рамки данного вопроса.
Подробнее здесь: https://stackoverflow.com/questions/791 ... funct-bool