我最近看到一个示例,其中演示了以下内容:
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/