Pourquoi un arbre d'expression ne peut-il pas contenir une spécification d'argument nommé?

c# c#-4.0 expression-trees

Question

En utilisant AutoMapper, je me suis rendu à un endroit où un argument nommé aurait très bien sa place:

.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, isAdvanced: false)))

Mais le compilateur m'a crié:

Une arborescence d'expression ne peut pas contenir une spécification d'argument nommé

J'ai donc dû revenir à:

.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, isAdvanced: false)))

Quelqu'un sait-il pourquoi le compilateur interdit les arguments nommés dans cette situation?

Réponse acceptée

Considérer ce qui suit:

static int M() { Console.Write("M"); return 1; }
static int N() { Console.Write("N"); return 2; }
static int Q(int m, int n) { return m + n; }
...
Func<int> f = ()=>Q(n : N(), m: M());
Expression<Func<int>> x = ()=>Q(n : N(), m: M());
Func<int> fx = x.Compile();
Console.WriteLine(f());
Console.WriteLine(fx());

Vous êtes d'accord, j'espère que les deux dernières lignes doivent faire exactement la même chose, non? Qui est d'imprimer NM3 .

Maintenant, quels appels de bibliothèque d'arborescence d'expression souhaiteriez-vous que la conversion génère pour assurer cela? Il n'y en a pas! Nous sommes donc confrontés aux choix suivants:

  1. Implémentez la fonctionnalité dans la bibliothèque d'arborescence d'expression. Ajoutez une transformation dans le moteur d'abaissement de l'arborescence des expressions qui préserve l'ordre d'exécution des arguments nommés. Implémentez le code dans la méthode Compile qui prend en compte l'ordre d'exécution.
  2. Faire x = ()=>Q(n : N(), m: M()); effectivement mis en œuvre sous la forme x = ()=>Q(M(), N()); et être incompatible avec la version non-expression-tree.
  3. Interdit les arguments nommés dans les arbres d'expression. Implémenter un message d'erreur à cet effet.

(1) c'est bien, mais cher. (2) est un non-starter; nous ne pouvons pas en toute conscience introduire ce genre de "gotcha". (3) est bon marché mais irritant.

Nous avons choisi (3).




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi