本文介绍了表达式树不能包含对局部函数的引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
错误:表达式树不能包含对本地函数的引用
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开发人员决定不允许这样做,以避免混淆(源代码中看到的函数的名称和表达式树中的函数的名称)。使用匿名函数时不会出现这种混淆,因此允许使用匿名函数。
这篇关于表达式树不能包含对局部函数的引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!