【问题标题】:An expression tree may not contain a reference to a local function表达式树可能不包含对局部函数的引用
【发布时间】:2017-10-28 22:29:28
【问题描述】:

错误:表达式树可能不包含对局部函数的引用

public void Initialize()
{
    CloudStorageProperties ImageFileProperties(string fileName) => _cloudStorage.GetBlob(CloudStorageType.Image, fileName).FileProperties;

    Config = new MapperConfiguration(x =>
    {
        x.CreateMap<Category, CategoryViewModel>()
            .ForMember(vm => vm.ImagePath, m => m.MapFrom(src => ImageFileProperties(src.ImageFile.Name).Uri.AbsoluteUri));
    });
}

我可以用匿名函数替换本地函数,它可以工作,但更清晰地说我应该将它转换为本地函数。

为什么不允许这样做?

【问题讨论】:

    标签: c# resharper c#-7.0


    【解决方案1】:

    这是 Roslyn 中的 pull request 进行此更改:

    现在不允许在表达式树中引用局部函数, 将来可能会或可能不会改变(以前他们是 生成为对损坏的方法名称的引用,这似乎 错误的)。为此添加了一个新错误。

    所以这背后的原因是:当你在表达式树中引用一个方法时 - 它被表示为 MethodCall 具有给定方法名称的表达式。如果您引用名称为 ImageFileProperties 的本地函数 - 您会期望 MethodCall 具有相同的名称。表达式树的目的是分析和解构,因此名称在那里很重要。但实际上,本地函数被编译为静态函数,其名称类似于 &lt;Initialize&gt;g__ImageFileProperties1_0(在上面的引用中被称为“损坏的方法名称”)。出于这个原因,Roslyn 开发人员决定不允许这样做以避免混淆(您在源代码中看到的函数名称和表达式树中的函数名称)。使用匿名函数就没有这种混乱,所以它们是允许的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-13
      • 2013-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 2012-09-06
      • 2011-10-30
      相关资源
      最近更新 更多