"没有为类型“System.String”定义二元运算符 Add;和“System.String”。 - 真的吗?
当尝试运行以下代码时:
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");
我收到标题中引用的错误:“未为类型‘System.String’和‘System.String’定义二元运算符 Add。”真的是这样吗?显然在 C# 中它是有效的。在 C# 中执行 string s = "A" + "B"
是否是表达式编译器无法访问的特殊语法糖?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这是绝对正确的,是的。不存在这样的运算符 - C# 编译器将
string + string
转换为对string.Concat
的调用。 (这很重要,因为这意味着 x + y + z 可以转换为 string.Concat(x, y, z) ,从而避免毫无意义地创建中间字符串。查看 字符串运算符 的文档 - 仅
==
和!=
已定义通过框架。It's absolutely right, yes. There is no such operator - the C# compiler converts
string + string
into a call tostring.Concat
. (This is important, because it means thatx + y + z
can be converted intostring.Concat(x, y, z)
which avoids creating intermediate strings pointlessly.Have a look at the docs for string operators - only
==
and!=
are defined by the framework.这也让我感到困惑,正如 Jon 在他的回答中指出的那样,C# 编译器将
string + string
转换为string.Concat
。 Expression.Add 方法重载< /a> 允许您指定要使用的“add”方法。您可能需要更改
string.Concat
方法以使用正确的 过载。证明这是有效的:
将输出:
This just caught me out too, and as Jon points out in his answer, the C# compiler converts
string + string
intostring.Concat
. There is an overload of the Expression.Add method that allows you to specify the "add" method to use.You might want to change the
string.Concat
method to use the correct overload.Proving this works:
Will output:
是啊,是不是很惊喜!!!编译器将其替换为对 String.Concat 的调用。
Yeah, it's a surprise isn't it!!! The compiler replaces it with a call to String.Concat.