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,因为表达式的编译时类型ox和oy是object.此运算符仅比较引用.引用是不同的(它们引用不同的值),因此返回False.请注意,在这种情况下,和的值将在执行时引用字符串,但在编译器决定调用哪个重载时不会考虑这些值.(它仅知道的和为类型的).oxoyoxoyobject
第三次调用==使用动态类型在执行时发现操作符,使用实际的引用类型,而不是表达式的编译时类型.这会发现过载string,因此操作员再次返回True.