【发布时间】:2011-08-11 14:09:59
【问题描述】:
尝试运行以下代码时:
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");
我收到标题中引用的错误:“二元运算符 Add 没有为类型 'System.String' 和 'System.String' 定义。”真的是这样吗?显然在 C# 中它可以工作。是否在表达式编译器无法访问的 C# 特殊语法糖中做 string s = "A" + "B"?
【问题讨论】:
-
后续我猜:为什么表达式编译器没有像 C# 编译器一样神奇?
-
回答后续,为什么要呢?虽然有些语言使用
+作为连接运算符以及数字类型的加法运算符,但这并不通用(其他常见的连接运算符包括.、||、&、<<)甚至那些使用+的人在这种情况下也将其称为concatenation。Expression.Add方法被称为Add并且人们可以期望它做加法而不做任何其他事情(除非一个类型已经重载了+但是因为它在内部是一个名为op_addition的方法,该类型声称它是添加)。
标签: c# expression-trees