C#扩展方法无法按预期工作 - 请参阅示例

Kru*_*lur 1 .net c# extension-methods

我想知道C#中扩展方法的行为.请参阅以下示例:

static string ExtendedToString( this object oObj )
{
    return "Object";
}

static string ExtendedToString( this Array oArray )
{
    return "Array";
}

// Example 1: int array - working as expected.
int[] o = new int[] { 1, 2, 3 };
o.ExtendedToString( ); // returns "Array"

// Example 2: array as object - did not expect the result.
object o = new int[] { 1, 2, 3 };
o.ExtendedToString( ); // returns "Object"
Run Code Online (Sandbox Code Playgroud)

为什么(在最后一种情况下)调用了对象的扩展方法而不是int []的方法?

Tho*_*que 9

过载分辨率在编译时执行.编译器看到它o 被声明为object,因此它调用带有的重载object.实际上o在运行时包含数组的事实是无关紧要的,因为编译器不知道它.

这实际上并不是特定于扩展方法,你可以通过将其称为普通静态方法得到相同的结果(ExtensionsClass.ExtendedToString(o))