5

考虑这个类:

public class Thing {

    public string Color { get; set; }

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

}

我可以省略关键字this,因为Color它是 的属性Thing,并且我在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();
}
4

2 回答 2

14

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

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

在其中一种形式的方法调用 (7.5.5.1) 中

表达式标识符 ( )
expr标识符 ( args )
expr标识符 < typeargs > ( )
expr标识符 < typeargs > ( args )

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

如果没有this,您的调用将不会采用这种形式,因此规范的该部分将不适用。

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

于 2013-09-10T15:41:14.953 回答
0

因为您需要调用它要调用的扩展方法类型,因为 Extension 被定义为Thing,所以对象需要调用自身以及为其定义的静态方法

于 2013-09-10T15:41:42.173 回答