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

时间:2017-05-28 14:39:56

标签: c# resharper c#-7.0

  

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

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

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

为什么不允许这样做?

1 个答案:

答案 0 :(得分:9)

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

  

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

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