C#动态的运算符?

Roy*_*mir 8 c# clr dynamic .net-4.0

我有这个功能:

static void Func1<T>(T x, T y)
{
    dynamic result = ((dynamic)x + y); //line 1
    dynamic result2 = (x + y);         //line 2
}
Run Code Online (Sandbox Code Playgroud)

这个func可以执行为Func(1,2);但是,第1行是OK,而第2行是BANG(在编译时).

从第2行抛出的异常是:

运算符'+'不能应用于'T'和'T'类型的操作数

因此,我们需要创建一个运算符重载.好的,到目前为止一切顺利.

但是第1行呢?它不应该也需要动态演员y吗?

((dynamic)x + (dynamic)y);

我知道它正在运行时进行评估,但为什么C#编译器接受第+1行中的运算符(即错误地认为T可以是+其他东西)?

use*_*116 7

在你的第一个例子中,通过使x一个dynamic你实际上所做的operator+操作动态以及.这摆脱了类型说明符的T对x,从而摆脱了投诉T没有有效operator+.

在运行时,将发生动态绑定并评估两个操作数以确保operator+可以使用:

如果算术运算符的操作数具有编译时类型dynamic,则表达式是动态绑定的(第7.2.2节).在这种情况下,表达式的编译时类型是动态的,下面描述的解析将在运行时使用具有编译时类型dynamic的那些操作数的运行时类型进行.

在第二个示例中,编译器知道类型,x + y并且只是将结果存储到dynamic变量中.进一步的用法result2将动态绑定.这是有道理的,因为赋值运算符右侧没有动态操作:

当不涉及动态表达式时,C#默认为静态绑定,这意味着在选择过程中使用组成表达式的编译时类型.