繁体   English   中英

C#动态的运算符?

[英]Operator with C# dynamic?

我有这个功能:

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

该func可以作为Func(1,2);执行Func(1,2); 但是,第1行是正常的 ,而第2行是BANG (在编译时)。

从第2行抛出的异常是:

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

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

但是第1行呢? 难道不应该需要一个动态的演员还上y

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

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

在你的第一个例子中,通过使x成为dynamic你实际上也使得operator+操作也是动态的。 这摆脱了x的类型说明符T ,从而摆脱了T没有有效operator+的抱怨。

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

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

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

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

dynamic基本上告诉编译器“不要试图确保我所做的是合法的;我确信它将在运行时”。 您在动态类型变量上尝试的任何操作都将编译。 如果分配给动态变量的类型实际上没有实现该操作,则它将无法成功运行。

至于为什么它们都不必是动态的,编译器基本上会尝试在与LValue一起开始的匹配签名的操作中涉及的任何类型上找到一个运算符(静态方法)。 在LValue是动态的情况下,编译器必须假设操作存在于将用作X的任何内容上,即使X与Y具有相同的占位符类型,并且不知道Y具有+运算符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM