错误:表达式树可能不包含对本地函数的引用
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));
});
}
我可以使用匿名函数替换本地函数,但它可以工作但是更锐利地说我应该将它转换为本地函数。
为什么不允许这样做?
答案 0 :(得分:9)
以下是Roslyn中的pull request进行了此更改:
表达式树中现在不允许引用局部函数, 未来可能会或可能不会改变(以前他们是 生成为一个受损的方法名称的引用,似乎 错误)。为此添加了新错误。
所以这背后的原因是:当你在表达式树中引用一个方法时 - 它用给定的方法名表示为MethodCall
表达式。如果您引用名为ImageFileProperties
的本地函数 - 您希望MethodCall
具有相同的名称。表达树的目的是要进行分析和解构,因此名称在那里很重要。但实际上,本地函数被编译为静态函数,其名称类似于<Initialize>g__ImageFileProperties1_0
(被引用为&#34;被修改的方法名称&#34;在上面的引用中)。出于这个原因,Roslyn开发人员决定不允许这样做以避免混淆(您在源代码中看到的函数名称和表达式树中函数的名称)。使用匿名函数没有这种混淆,因此允许它们。