为什么这样呢。在实现接口的类中调用interfaceextension方法时需要限定符吗?

时间:2011-11-04 18:09:01

标签: c# interface extension-methods

给定界面

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.?没有它,名称就无法解决。

3 个答案:

答案 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,编译器就不知道将扩展方法应用于什么。