C#中的运算符重载

Sye*_*Ali 2 c#

我对C#语言中的运算符重载感到有点困惑,你能不能告诉我运算符是静态还是动态的.

Jon*_*eet 11

如果你的意思是"它是多态的还是不是?" 答案是否定的 - 除非你使用的是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
    }
}
Run Code Online (Sandbox Code Playgroud)

第一次调用==使用声明的运算符string,因为编译器知道两个操作数都是类型string.它比较两个字符序列,发现它们相等,并返回True.

第二个呼叫==使用宣布为运营商object,因为表达式的编译时类型oxoyobject.此运算符仅比较引用.引用是不同的(它们引用不同的值),因此返回False.请注意,在这种情况下,和的将在执行时引用字符串,但在编译器决定调用哪个重载时不会考虑这些值.(它知道的和为类型的).oxoyoxoyobject

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