【问题标题】:C# - Cannot use "is" operator in lambda expressionC# - 不能在 lambda 表达式中使用“is”运算符
【发布时间】:2020-06-22 02:31:19
【问题描述】:

我正在使用带有此代码的 AgileMapper:

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

但是,编译器在抱怨:

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

如果我使用value == null,它会起作用,但我想了解为什么is 不起作用?

【问题讨论】:

  • 改用ReferenceEquals(value, null);,内部是一样的。

标签: c# lambda operators expression


【解决方案1】:

value is null 使用常量模式。模式匹配是在 C# 7 中引入的,在表达式树之后很久,并且不能(当前)在表达式树中使用。这可能会在某个时候实施,但目前它是无效的。请注意,这仅适用于表达式树 - 不适用于转换为委托的 lambda 表达式。例如:

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
    }
}

表达式树中的代码存在各种限制。例如,您不能使用动态操作或元组文字。对模式匹配的限制只是另一个例子。

【讨论】:

  • 嗨,乔恩,是否有任何正在进行的讨论以增加对此的支持,您可以链接到? csharlang github 中的任何建议或类似的东西?
  • @julealgon:我不知道。我建议在 GitHub 存储库上询问。
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2013-01-16
  • 2014-11-13
  • 2022-01-21
  • 1970-01-01
  • 2016-06-14
  • 2023-03-03
相关资源
最近更新 更多