为什么使用+运算符的字符串连接与C#中的动态类型一起使用?

Mat*_*t H 4 c# string dynamic-language-runtime dynamic expression-trees

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

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

Add<string>("hello", "world");  // Returns "helloworld"
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用表达式来创建"通用"添加功能:

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.
Run Code Online (Sandbox Code Playgroud)

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

那怎么样,动态允许这个工作?我想在运行时它已超过使用String.Concat()重写+的点.

小智 6

dynamic使用复制C#编译器规则的运行时辅助函数.这些规则之一允许+string即使没有操作员由框架定义的对象.标准数字类型,例如int没有自定义运算符重载,也由编译器完成,需要在运行时使用时执行dynamic.这就是为什么你需要一个对Microsoft.CSharp.dll的引用:dynamic没有那些帮助函数就无法工作.