给定界面
public interface IHaveError
{
string ErrorMessage { get; set; }
}
扩展
public static class HaveErrorExtensions
{
public static void SetErrorMessage(this IHaveError target, string message)
{
target.ErrorMessage = message;
}
}
类
public class HaveError : IHaveError
{
public string ErrorMessage { get; set; }
public void DoSomething()
{
this.SetErrorMessage(message);
}
}
为什么调用扩展方法时需要this.
?没有它,名称就无法解决。
答案 0 :(得分:4)
扩展方法只是静态方法,由编译器应用一些语法糖(非常美味的语法糖!)。该方法被称为'on'的对象引用实际上是该方法的第一个参数。
编译器需要知道你的意思是什么实例。它无法猜测。
答案 1 :(得分:4)
这是扩展方法在C#语言规范中的工作方式。如果您阅读“7.6.5.2扩展方法调用”一节,它基本上说您必须调用以下形式之一的方法:
expr . identifier ( )
expr . identifier ( args )
expr . identifier < typeargs > ( )
expr . identifier < typeargs > ( args )
如果您注意到,expr
必需,则可以选择扩展方法搜索。
在这种情况下,this.
成为上面的expr.
,因此上面的内容可以转换为静态方法调用,其类型是扩展方法定义为:
C . indentifier ( expr , args )
在您的情况下,为了让编译器“查找”(或甚至搜索)方法调用,您需要指定一些“expr”类型。明确的this.
符合条件。它导致编译器采取这个:
this.SetErrorMessage(message);
并搜索与该类型一起使用的匹配扩展方法,将其翻译为:
HaveErrorExtensions.SetErrorMessage(this, message);
答案 2 :(得分:3)
因为this
引用了您正在使用的当前对象。如果没有this
,编译器就不知道将扩展方法应用于什么。