考虑以下代码:
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>>
但这超出了这个问题的范围。