Quelle est l'histoire avec ExpressionType.Assign?

c# expression-trees lambda linq

Question

J'avais l'impression que l'attribution n'était pas possible dans une expression lambda. Par exemple, le code suivant (certes pas très utile)

Expression<Action<int, int>> expr = (x, y) => y = x;

Produit l'erreur du compilateur

An expression tree may not contain an assignment operator

Et pourtant, selon la documentation de Microsoft , on peut créer par programmation une expression d'affectation à l'aide de Expression.Assign . Sauf erreur de ma part, le code suivant produit une Expression équivalente:

ParameterExpression xparam = Expression.Parameter(typeof(int), "x");
ParameterExpression yparam = Expression.Parameter(typeof(int), "y");
BinaryExpression body = Expression.Assign(yparam, xparam);
var expr = Expression.Lambda<Action<int, int>>(body, xparam, yparam);
var cexpr = expr.Compile();

Dans ce cas, le compilateur ne se plaint pas. Je sens qu'il me manque une distinction importante ici.

Réponse acceptée

la réponse de usr est correcte; pour développer quelque peu dessus:

Vous ne manquez pas une distinction importante, il vous manque une dimension importante: le temps.

Si vous examinez attentivement la documentation, vous remarquerez que le nœud Assign été ajouté dans .NET 4.0.

Les arbres d'expression ont été ajoutés à C # 3.0, fourni avec .NET 3.5.

L’équipe qui possède la bibliothèque d’arbres d’expression a ajouté de nombreuses fonctionnalités depuis la publication de .NET 3.5. L'utilisation de ces fonctionnalités pour permettre à davantage d'expressions de figurer dans une arborescence d'expressions en langage C # n'a pas permis la suppression de C # 4.0 ou C # 5.0. Il n'y a aucune raison de ne pas faire la fonctionnalité; c'est une caractéristique parfaitement sensible. Mais les concepteurs de langage n’exigent pas de raison de ne pas faire de fonctionnalité; ils ont besoin d'une raison pour dépenser le budget sur une fonctionnalité.

Dans ce cas, des arbres d'expression plus riches en C # ne l'ont tout simplement pas placé suffisamment haut dans la liste des priorités. Si vous souhaitez que cette fonctionnalité soit prioritaire, vous pouvez ouvrir un problème sur connect.microsoft.com et le demander. Votre demande sera probablement implémentée si vous incluez un scénario convaincant pour la fonctionnalité.


Réponse populaire

Vous ne comprenez rien. C # est intentionnellement restrictif dans les types d'arbres d'expression qu'il peut générer pour vous. Il n'y a aucune raison de principe pour laquelle il ne pourrait pas avoir cette fonctionnalité. Cela n'a tout simplement pas été investi. (La création de fonctionnalités supprime des ressources. Souhaitez-vous plutôt avoir des déclarations async/await ou des expressions d'arborescence d'expression? Clairement, la première option est plus utile.).

Vous ne pouvez pas non plus générer d'autres instructions, telles que if ou while bien qu'elles figurent dans l'API de l'arborescence des expressions commençant par .NET 4. (Vous pouvez désormais construire et compiler des flux de contrôle complexes avec des arborescences d'expression).




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