与表达式进行模式匹配<Func<T, bool>>

问题描述 投票:0回答:1

考虑以下代码:

internal static class Program
{
    private static void Main()
    {
        object value = "Hello";
        Console.WriteLine(value.Test(o => o is string));
    }

    private static bool Test<T>(this T value, Expression<Func<T, bool>> 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<T>(this T value, Expression<Func<T, bool>> test) =>
        test.Compile().Invoke(value);
}

结果:

表达式树不能包含模式匹配的“is”表达式

我很好奇为什么后一个代码会产生上述编译器错误,但前一个代码却不会,即使它也是一个模式匹配的“is”表达式;即为什么允许类型匹配,但不允许空匹配?

注意:我知道我可以使用

Func<T, bool>
代替
Expression<Func<T, bool>>
但这超出了这个问题的范围。

c# pattern-matching linq-expressions
1个回答
0
投票

is
作为类型测试
obj is Foo
)的用法非常古老,来自 C# 的早期。

is
关键字后来被扩展为包括patterns
obj is null
obj is string s
等),首先在 C# 7 中,然后在后续版本中进一步扩展。

出于向后兼容性的原因,表达式被困在 C# 3 中,因此它们支持类型测试,但不支持模式。

© www.soinside.com 2019 - 2024. All rights reserved.