可能重复:
Why is the 'this' keyword required to call an extension method from within the extended class
我在某个命名空间下的程序集中声明了一个扩展方法,它是一个非常常见的帮助器:
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中。
这是正常还是我做错了什么?感谢。
答案 0 :(得分:3)
这是正常还是我做错了什么?感谢。
这很正常。扩展方法必须扩展某些东西。编译器不会搜索扩展方法,除非有“表达式”(在。的左侧)。这是在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 )
答案 1 :(得分:1)
这是因为您只能对该类型的对象使用扩展方法,并且当您的类继承IServiceProvider时,在这种情况下您必须使用this.
。
我希望我理解你的问题,这将使你得到答案,但GetService();因为在任何情况下扩展方法的语法都不正确,所以是不可能的。
答案 2 :(得分:0)
扩展方法用于在objects / Class中使用。在这种情况下,您有一个静态类,它的作用类似于类的唯一实例。
因此,如果您创建扩展方法,则对象的实例将能够使用它。