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

An expression tree may not contain a reference to a local function(表达式树不能包含对局部函数的引用)

本文介绍了表达式树不能包含对局部函数的引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

错误:表达式树不能包含对本地函数的引用

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

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

为什么不允许这样做?

推荐答案

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

现在不允许在表达式树中引用局部函数, 这在未来可能会改变,也可能不会改变(以前是 作为对损坏的方法名称的引用生成,看起来 错误)。为此添加了新错误。

因此其背后的推理是:当您引用表达式树中的方法时,它被表示为具有给定方法名称的MethodCall表达式。如果引用名称为ImageFileProperties的局部函数,则应该使用相同名称的MethodCall。表达式树的目的是被分析和解构,所以名字在那里很重要。但在现实中,局部函数被编译为名称类似于<Initialize>g__ImageFileProperties1_0的静态函数(在上面的引号中称为"损坏的方法名")。出于这个原因,Roslyn开发人员决定不允许这样做,以避免混淆(源代码中看到的函数的名称和表达式树中的函数的名称)。使用匿名函数时不会出现这种混淆,因此允许使用匿名函数。

这篇关于表达式树不能包含对局部函数的引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:表达式树不能包含对局部函数的引用

基础教程推荐