Quelle est la différence entre Expression.Variable () et Expression.Parameter ()?

.net c# expression expression-trees

Question

Les deux semblent retourner le même type et avoir la même signature.

Alors, quelle est la différence entre eux, et quand devrions-nous utiliser chacun?

Réponse acceptée

Expression.Variable est utilisé pour déclarer une variable locale dans un bloc. Expression.Parameter est utilisé pour déclarer un paramètre pour une valeur entrante.

Actuellement, C # n'autorise pas les expressions lambda à déclaration, mais si c'est le cas , imaginez:

// Not currently valid, admittedly...
Expression<Func<int, int>> foo = x =>
{
    int y = DateTime.Now.Hour;
    return x + y;
};

Si cela était valide, le compilateur C # générerait du code utilisant Expression.Parameter pour x et Expression.Variable pour y .

Au moins, c'est ce que j'ai compris. C'est vraiment dommage que la documentation pour les deux méthodes soit fondamentalement la même :(


Réponse populaire

En réalité, il n'y a pas de différence, mis à part le fait que Variable() n'autorise pas les types ref . Pour voir cela, vous pouvez regarder la source de référence :

public static ParameterExpression Parameter(Type type, string name) {
    ContractUtils.RequiresNotNull(type, "type");

    if (type == typeof(void)) {
        throw Error.ArgumentCannotBeOfTypeVoid();
    }

    bool byref = type.IsByRef;
    if (byref) {
        type = type.GetElementType();
    }

    return ParameterExpression.Make(type, name, byref);
}

public static ParameterExpression Variable(Type type, string name) {
    ContractUtils.RequiresNotNull(type, "type");
    if (type == typeof(void)) throw Error.ArgumentCannotBeOfTypeVoid();
    if (type.IsByRef) throw Error.TypeMustNotBeByRef();
    return ParameterExpression.Make(type, name, false);
}

Comme vous pouvez le constater, les deux méthodes appellent ParameterExpression.Make() , ainsi l'objet renvoyé se comportera de la même manière.



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