gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:26:30 25 4
gpt4 key购买 nike

Error: 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 说我应该将它转换为本地函数。

为什么不允许这样做?

最佳答案

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

References to local functions are now disallowed in expression trees, which may or may not change in the future (Previously they were generated as a reference to a mangled method name, which seemed wrong). Added a new error for this.

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

关于c# - 表达式树不能包含对局部函数的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44228502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com