2017-05-28 87 views
5

Error: An expression tree may not contain a reference to a local functionbir ifade ağaç Ben isimsiz işlevi ile yerel işlevini yerine yerel bir fonksiyonu

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

bir başvuru içeremez ve fakat daha keskin bir yerel işleve dönüştürmek gerektiğini söylüyor yeniden çalışır.

Neden buna izin verilmiyor? İşte

cevap

6

bu değişikliği yapar Roslyn pull request geçerli:

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.

Yani bu arkasındaki mantık şudur: ifade ağacında bir yöntem başvuru ne zaman - bu verilen yöntem adı ile MethodCall ifadesi olarak temsil edilir. Yerel fonksiyona ImageFileProperties ismiyle başvurursanız, aynı adla MethodCall beklersiniz. İfade ağacı amacı analiz edilmeli ve yapısöküme edilmelidir, bu yüzden isimler burada önemlidir. Ancak gerçekte yerel işlevler, <Initialize>g__ImageFileProperties1_0 gibi isimlerle statik işlev olarak derlenmiştir (yukarıdaki tırnak içinde "mangled method name" olarak adlandırılır). Bu sebepten ötürü Roslyn geliştirici (ler) bu durumun karışıklıktan kaçınmasına izin vermemeye karar vermişlerdir (kaynak kodunda gördüğünüz işlevin adı ve ifade ağacındaki işlevin adı). Anonim işlevde böyle bir karışıklık yoktur, bu yüzden izin verilir.