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声明的运算符,因为表达式oxoy的编译时类型是object 。 此运算符仅比较引用。 引用是不同的(它们引用不同的值),因此返回False。 请注意,在这种情况下, oxoy将在执行时引用字符串,但在编译器决定调用哪个重载时不会考虑这一点。 (它只知道oxoy是类型object 。)

第三次调用==使用动态类型在执行时发现操作符,使用实际的引用类型,而不是表达式的编译时类型。 这会发现string的重载,因此操作符再次返回True。

基本的运算符重载是静态的:

 public static SomeClass operator ++(SomeClass arg) 

试试本系列展示一些例子