2

可能重复:
为什么从扩展类中调用扩展方法需要“this”关键字

我在某个命名空间下的程序集中声明了一个扩展方法,它是一个非常常见的助手:

using System;

namespace Common {
    public static class GenericServiceProvider {
        public static T GetService<T>(this IServiceProvider serviceProvider) {
             return (T)serviceProvider.GetService(typeof(T));
        }
    }
}

现在在不同的程序集和命名空间中,我试图从实现 IServiceProvider 的类中访问此扩展方法:

using System;
using Common;

namespace OtherNamespace {
    class Bar: IServiceProvider {
        void Foo() {
            GetService<IMyService>(); // doesn't compile
            this.GetService<IMyService>(); // compiles
        }
    }
}

如您所见,我无法直接调用通用扩展方法,它甚至没有出现在 IntelliSense 中。但是,如果我在调用之前添加“this”,它就可以正常工作。

这是在使用 .NET 4 的 Visual Studio 2010 中。

这是正常的还是我做错了什么?谢谢。

4

3 回答 3

4

这是正常的还是我做错了什么?谢谢。

这个是正常的。扩展方法必须扩展一些东西。编译器不会搜索扩展方法,除非有“表达式”(在“.”的左侧)。这是在 C# 语言规范 7.6.5.2 中定义的:

7.6.5.2 Extension method invocations

In a method invocation (§7.5.5.1) of one of the forms
expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )

基本上,你总是需要一些东西expr。在这种情况下,this工作正常,编译器可以将其重写为:

C . identifier ( expr ) 
于 2012-06-13T18:01:58.430 回答
1

这是因为您只能在该类型的对象上使用扩展方法,并且由于您的类继承了 IServiceProvider,因此您必须this.在这种情况下使用。我希望我理解你的问题,这将使你的答案,但 GetService(); 不可能,因为在任何情况下扩展方法的语法都不正确。

于 2012-06-13T17:56:59.390 回答
0

扩展方法用于对象/类的实例。在这种情况下,您有一个静态类,它就像一个类的唯一实例一样工作。

所以,如果你创建一个扩展方法,一个对象的实例就可以使用它。

于 2012-06-13T18:00:20.147 回答