c# - 为什么使用 + 运算符的字符串连接适用于 C# 中的动态类型?

标签 c# string dynamic expression-trees dynamic-language-runtime

我最近看到一个示例,其中演示了以下内容:

T Add<T>(dynamic a, dynamic b)
{
    return a + b;
}

Add<string>("hello", "world");  // Returns "helloworld"

但是,如果我尝试使用表达式来创建“通用”Add 函数:

ParameterExpression left = Expression.Parameter(typeof(T), "left");
ParameterExpression right = Expression.Parameter(typeof(T), "right");
var add = Expression.Lambda<Func<T, T, T>>(Expression.Add(left, right), left, right).Compile();  // Fails with System.InvalidOperationException : The binary operator Add is not defined for the types 'System.String' and 'System.String' when T == String.

然后将此函数与字符串一起使用,它失败了,因为 String 类型实际上并未实现 + 运算符,而只是 String.Concat() 的语法糖。

那么,动态如何让它发挥作用呢?我认为在运行时它已经过了使用 String.Concat() 重写 + 的地步。

最佳答案

dynamic 使用复制 C# 编译器规则的运行时辅助函数。这些规则之一允许在 string 对象上使用 +,即使框架没有定义运算符。 int 等标准数字类型也没有自定义运算符重载,这也是由编译器完成的,并且需要在使用 dynamic 时在运行时执行。这就是您需要引用 Microsoft.CSharp.dll 的原因:没有这些辅助函数,dynamic 无法工作。

关于c# - 为什么使用 + 运算符的字符串连接适用于 C# 中的动态类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11707022/

相关文章:

c# - 为 Array 的值打印 X

c - 来自 C 函数的字符串

javascript - 如何使用 jQuery 读取外部 html 文件并将其存储到字符串变量?显示错误

c# - 为什么在内部类上 C# 动态找不到接口(interface)的方法?

c# - Windows 7 上的 WPF 应用程序仅在按下 CTRL 键后才能正常响应

c# - lock(syncRoot) 对静态方法有何意义?

c# - C#编辑字符串以添加特定长度的换行符

MYSQL 查询替换字符串的一部分

c++ - 动态分配列表中的访问元素

c# - 使 LINQ 查询更好