考虑这个课程:
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();
}
答案 0 :(得分:11)
我可以在引用属性和方法时省略它,为什么我不能这样做??
这只是扩展方法调用的一部分,基本上。 C#规范(扩展方法调用)的第7.6.5.2节开始:
在其中一种形式
的方法调用(7.5.5.1)中expr 。 标识符
(
)
expr 。 标识符(
args)
expr 。 标识符<
typeargs>
(
)
expr 。 标识符<
typeargs>
(
args)
如果调用的正常处理找不到适用的方法,则尝试将构造作为扩展方法调用进行处理。
如果没有this
,您的调用就不会是那种形式,因此规范部分不适用。
当然,这不是为什么功能设计的理由 - 当然 - 它是编译器在正确性方面的行为的理由。
答案 1 :(得分:1)
因为您需要调用哪个 扩展方法类型 才会调用,因为扩展名定义为 Thing ,对象需要调用自身以及为其定义的静态方法。