Gdy próbuje uruchomić następujący kod:"Operator binarny Add nie jest zdefiniowany dla typów" System.String "i" System.String "." - Naprawdę?
Expression<Func<string, string>> stringExpression = Expression.Lambda<Func<string, string>>(
Expression.Add(
stringParam,
Expression.Constant("A")
),
new List<ParameterExpression>() { stringParam }
);
string AB = stringExpression.Compile()("B");
pojawia się błąd wymieniony w tytule: „Operator binarny dodawania nie jest zdefiniowana dla«System.String»typów i«System.String»” Czy tak jest naprawdę? Oczywiście w C# działa. Czy robisz string s = "A" + "B"
w C# specjalnego cukru syntaktycznego, do którego kompilator wyrażeń nie ma dostępu?
Followup Chyba: Dlaczego nie kompilator wyrażenie zrobić tę samą magię jako kompilatora C# ? – Shlomo
Aby odpowiedzieć na pytanie, dlaczego tak się dzieje? Chociaż istnieją języki, które używają '+' jako operatora konkatenacji, a także operatora dodawania na typach liczbowych, to nie jest uniwersalne (innymi typowymi operatorami konkatencji są '.',' || ',' & ', << '), a nawet te, które używają' + 'nazywają to * konkatenacją * w tym kontekście. Metoda "Expression.Add" nazywa się 'Add' i można się spodziewać, że zrobi addycję i nie zrobi nic innego (chyba że typ przeciążył' + ', ale wtedy wewnętrznie jest to metoda o nazwie' op_addition', której typ pobiera to jest * dodaj *). –