我最近看到了一个示例,其中演示了以下内容:
T Add<T>(dynamic a, dynamic b)
{
return a + b;
}
Add<string>("hello", "world"); // Returns "helloworld"
但是,如果我尝试使用表达式来创建“通用”添加函数:
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() 重写 + 的点。