在他们扩展的类中使用扩展方法

时间:2013-09-10 15:37:27

标签: c# class extension-methods

考虑这个课程:

public class Thing {

    public string Color { get; set; }

    public bool IsBlue() {
        return this.Color == "Blue";   // redundant "this"
    }

}

我可以省略关键字this,因为ColorThing的属性,我在Thing内编码。

如果我现在创建一个扩展方法:

public static class ThingExtensions {

    public static bool TestForBlue(this Thing t) {
        return t.Color == "Blue";
    }

}

我现在可以将IsBlue方法更改为:

public class Thing {

    public string Color { get; set; }

    public bool IsBlue() {
        return this.TestForBlue();   // "this" is now required
    }
}

但是,我现在需要添加this关键字。

引用属性和方法时我可以省略this,为什么我不能这样做??

public bool IsBlue() {
    return TestForBlue();
}

2 个答案:

答案 0 :(得分:11)

  

我可以在引用属性和方法时省略它,为什么我不能这样做??

这只是扩展方法调用的一部分,基本上。 C#规范(扩展方法调用)的第7.6.5.2节开始:

  

在其中一种形式

的方法调用(7.5.5.1)中      

expr 标识符 ( )
     expr 标识符 ( args )
     expr 标识符 < typeargs > ( )
     expr 标识符 < typeargs > ( args )

     

如果调用的正常处理找不到适用的方法,则尝试将构造作为扩展方法调用进行处理。

如果没有this,您的调用就不会是那种形式,因此规范部分不适用。

当然,这不是为什么功能设计的理由 - 当然 - 它是编译器在正确性方面的行为的理由。

答案 1 :(得分:1)

因为您需要调用哪个 扩展方法类型 才会调用,因为扩展名定义为 Thing 对象需要调用自身以及为其定义的静态方法