Compilateur C# erreur: Impossible de convertir l'expression lambda
Je suis en train d'utiliser une Lambda expression et de réflexion pour obtenir un membre de noms hiérarchique (plutôt que d'utiliser un texte constant), à appliquer des erreurs de compilation si mon contrôle de liaison de l'information n'est pas valide.
C'est dans un ASP.NET projet MVC, mais ce n'est pas un MVC-question spécifique autant que je sache. EDIT: plus Précisément, je veux la suite pour évaluer la valeur true:
string fullname = GetExpressionText(model => model.Locations.PreferredAreas);
"Locations.PreferredAreas" == fullname;
Au lieu de cela, je reçois un message d'erreur de compilation:
Erreur 4: Ne peut pas convertir expression lambda de type
'Système.Linq.Les Expressions.LambdaExpression " parce qu'il n'est pas un type délégué.
Pourquoi le paramètre de travailler dans le deuxième cas ci-dessous, mais pas la première?
//This doesn't compile:
string tb1 = System.Web.Mvc.ExpressionHelper.
GetExpressionText(model => model.Locations.PreferredAreas);
//But this does:
MvcHtmlString tb2 =
Html.TextBoxFor(model => model.Locations.PreferredAreas);
Voici le code à partir de la ASP.NET MVC projet Codeplex. Il me semble qu'il passe le même paramètre grâce à la même méthode:
//MVC extension method
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) {
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
return TextBoxHelper(
htmlHelper,
metadata,
metadata.Model,
ExpressionHelper.GetExpressionText(expression),
htmlAttributes);
}
//MVC utility method
public static string GetExpressionText(LambdaExpression expression) {
//Split apart the expression string for property/field accessors to create its name
//etc...
Jamais l'esprit, c'est un MVC helper. Voir ma réponse.
est-ce réellement pertinent? basé sur Eric Lippert réponse (le contenu de sa réponse, et non pas simplement le fait qu'il était capable de répondre) la source derrière le GetExpressionText n'est pas pertinent, non?
Vous souvenez-vous de ce que vous fini? Où était ce délégué Eric était en train de parler?
Voir la réponse ci-dessous pour un exemple de code, Lum.
OriginalL'auteur shannon | 2011-03-15
Vous devez vous connecter pour publier un commentaire.
Le message d'erreur est correct. Un lambda peut être converti en un compatible type délégué, D ou une expression-des-compatible-délégué de type
Expression<D>
.Expression<Func<TM, TP>>
est l'un de ceux-ci. "LambdaExpression" n'est ni de ceux-ci. C'est pourquoi vous obtenez une erreur d'essayer de convertir le lambda de LambdaExpression, mais non pas à une véritable expression du type d'arbre. Il y a un délégué là quelque part.vous dites (lambda Expression<D> LambaExpression) est valide et qu'est ce qui se passe, mais (lambda à LambdaExpression) ne l'est pas?
Correct. LambdaExpression est le de la classe de base de l'Expression<D>. Le lambda a besoin de savoir ce que le délégué est de type. Tout ce que vous êtes disant qu'il est "cette expression lambda doit être traité comme une expression lambda" Qui ne donne pas le compilateur rien à faire. Vous devez vous dire "cette expression lambda doit être traité comme une expression de l'arbre pour une expression qui prend un entier et retourne une chaîne de caractères" ou quoi que ce soit. Il doit y avoir un type délégué, quelque part.
ouais, c'est là où je suis confus, cependant, parce que les TM et les TP sont à la fois déduit de toute façon, de sorte que le compilateur connaît déjà le lamba est une expression qui prend un TM et renvoie un TP. Je suis sûr que je vais travailler à travers, bien 🙂
De qu'est-ce que TM déduit? (Le site d'appel et de la méthode d'extension que vous avez posté ne semblent pas correspondre.) Lorsque vous travaillez, vous découvrirez que TM est pas inférée à partir de la lambda; le lambda ne dispose pas de suffisamment d'informations pour déterminer de quel type de "modèle" doit être; cette information doit venir de quelque part et dans le LambdaExpression le cas où vous êtes de ne pas donner cette information pour le compilateur n'importe où.
OriginalL'auteur Eric Lippert
Je pense que vous devriez essayer d'utiliser une méthode d'aide comme ça:
il semble que ce serait le travail, mais l'instance de M n'est pas nécessaire, et donc, ce n'est pas réellement appartiennent dans les méthodes d'extension, droit?
Exactement, vous pouvez déclarer cette aide comme
GetExpressionText<M, P>(Expression<Func<M, P>> ex)
, mais dans ce cas, vous devez spécifier des paramètres de type explicite. Méthode d'Extension de la syntaxe est plus laconique, bien qu'elle nécessite de déclarer un "inutilisé" de paramètre.Désolé je ne peut pas affecter la réponse à deux endroits - Eric fixe mon cerveau, tu m'as donné le code que j'ai besoin... c'était un tirage au sort, mais je suppose que Eric répondu à la lettre de ma question et essayé (près avec succès) pour apprendre à un homme à pêcher, dans le processus.
otoh, que, Eric a beaucoup de points... LOL
OriginalL'auteur Oleg Tarasov
Avant d'essayer de corriger les expressions lambda, assurez-vous que les références suivantes ont déjà été ajoutés:
L'absence de ces références peuvent causer la même erreur ("Impossible de convertir l'expression lambda de type 'System.Linq.Les Expressions.Expression Lambda "parce qu'il n'est pas un délégué de type").
Espère que cela aide...
OriginalL'auteur Murat Yıldız