"没有为类型“System.String”定义二元运算符 Add;和“System.String”。 - 真的吗?

发布于 2024-11-29 05:47:12 字数 535 浏览 1 评论 0 原文

当尝试运行以下代码时:

    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" 是否是表达式编译器无法访问的特殊语法糖?

When trying to run the following code:

    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");

I get the error referenced in the title: "The binary operator Add is not defined for the types 'System.String' and 'System.String'." Is that really the case? Obviously in C# it works. Is doing string s = "A" + "B" in C# special syntactic sugar that the expression compiler doesn't have access to?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

┼── 2024-12-06 05:47:12

这是绝对正确的,是的。不存在这样的运算符 - 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 to string.Concat. (This is important, because it means that x + y + z can be converted into string.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.

说谎友 2024-12-06 05:47:12

这也让我感到困惑,正如 Jon 在他的回答中指出的那样,C# 编译器将 string + string 转换为 string.ConcatExpression.Add 方法重载< /a> 允许您指定要使用的“add”方法。

var concatMethod = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }); 
var addExpr = Expression.Add(Expression.Constant("hello "),Expression.Constant("world"), concatMethod);

您可能需要更改 string.Concat 方法以使用正确的 过载

证明这是有效的:

Console.WriteLine(Expression.Lambda<Func<string>>(addExpr).Compile()());

将输出:

你好世界

This just caught me out too, and as Jon points out in his answer, the C# compiler converts string + string into string.Concat. There is an overload of the Expression.Add method that allows you to specify the "add" method to use.

var concatMethod = typeof(string).GetMethod("Concat", new[] { typeof(string), typeof(string) }); 
var addExpr = Expression.Add(Expression.Constant("hello "),Expression.Constant("world"), concatMethod);

You might want to change the string.Concat method to use the correct overload.

Proving this works:

Console.WriteLine(Expression.Lambda<Func<string>>(addExpr).Compile()());

Will output:

hello world

风透绣罗衣 2024-12-06 05:47:12

是啊,是不是很惊喜!!!编译器将其替换为对 String.Concat 的调用。

Yeah, it's a surprise isn't it!!! The compiler replaces it with a call to String.Concat.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文