C#中的运算符重载
我对C#语言中的运算符重载感到有点困惑,你能否告诉我运算符本质上是静态还是动态的。
如果你的意思是“它是多态的吗?” 那么答案是否定的 – 除非你使用dynamic
类型,否则C#编译器会静态找到运算符。 例如,考虑以下代码:
using System; class Test { static void Main(string[] args) { string x = "hello"; string y = new string(x.ToCharArray()); Console.WriteLine(x == y); // True object ox = x; object oy = y; Console.WriteLine(ox == oy); // False dynamic dx = x; dynamic dy = y; Console.WriteLine(dx == dy); // True } }
第一次调用==
使用在string
声明的运算符,因为编译器知道两个操作数都是string
类型。 它比较两个字符序列,发现它们相等,并返回True。
对==
的第二次调用使用在object
声明的运算符,因为表达式ox
和oy
的编译时类型是object
。 此运算符仅比较引用。 引用是不同的(它们引用不同的值),因此返回False。 请注意,在这种情况下, ox
和oy
的值将在执行时引用字符串,但在编译器决定调用哪个重载时不会考虑这一点。 (它只知道ox
和oy
是类型object
。)
第三次调用==
使用动态类型在执行时发现操作符,使用实际的引用类型,而不是表达式的编译时类型。 这会发现string
的重载,因此操作符再次返回True。
基本的运算符重载是静态的:
public static SomeClass operator ++(SomeClass arg)
试试本系列展示一些例子