C#: opérateur implicite et les méthodes d'extension

Je suis en train de créer un PredicateBuilder<T> classe qui encapsule une Expression<Func<T, bool>> et fournit des méthodes pour construire facilement une expression avec divers And et Or méthodes. J'ai pensé qu'il serait cool si je pouvais utiliser cette PredicateBuilder<T> comme un Expression<Func<T, bool>> directement, et de la pensée de ce qui pourrait être fait par la présence d'une implicit operator méthode chose.

Version allégée de la classe ressemble à ceci:

class PredicateBuilder<T>
{
    public Expression<Func<T, bool>> Predicate { get; protected set; }

    public PredicateBuilder(bool initialPredicate)
    {
        Predicate = initialPredicate 
            ? (Expression<Func<T, bool>>) (x => true) 
            : x => false;
    }

    public static implicit operator Expression<Func<T, bool>>(
        PredicateBuilder<T> expressionBuilder)
    {
        return expressionBuilder.Predicate;
    }
}

Alors, un peu comme un test, j'ai cette extension de la méthode dans une classe statique:

public static void PrintExpression<T>(this Expression<Func<T, bool>> expression)
{
    Console.WriteLine(expression);
}

Dans ma tête, je dois être capable de faire ceux-ci:

var p = new PredicateBuilder<int>(true);

p.PrintExpression();
PredicateExtensions.PrintExpression(p);

Cependant aucune de ces travaux. Pour la première, la méthode d'extension qui n'est pas trouvé. Et pour le second, il est dit que

Le type des arguments de la méthode 'ExtravagantExpressions.PredicateHelper.PrintExpression(Système D'.Linq.Les Expressions.L'Expression>) " ne peut pas être déduit à partir de l'utilisation. Essayez de spécifier le type des arguments explicitement.

J'ai donc essayé la suivante, ce qui a fonctionné:

PredicateExtensions.PrintExpression<int>(p);

Aussi, cela fonctionne, bien sûr:

((Expression<Func<int, bool>>) p).PrintExpression();

Mais ouais... pourquoi ne pas les autres? Ai-je mal compris quelque chose sur la façon dont cette implicit operator chose qui fonctionne?

Merci pour le nettoyage! Je continue à écrire au lieu de l'extension de l'extension... je ne sais pas pourquoi! J'ai juste... ne peux pas... stop... =S

OriginalL'auteur Svish | 2009-03-26