为什么c#中没有“is not”关键字?

时间:2010-12-02 21:05:33

标签: c# compiler-construction types keyword

有时检查对象是否不是X的类型是有道理的,所以你需要这样做:

 if(this.GetType() != typeof(X)) 
 {
      //Do my thing.

 }

对我来说这有点麻烦,这样的事情会不会更好:

 if(this is not X) 
 {
     //Do my thing
 }

4 个答案:

答案 0 :(得分:21)

逻辑NOT运算符!怎么样,符合'not'这个词的描述就好了:

if (!(this is X)) 
{
    //Do my thing
}

正如其他人指出的那样,is也用于检查对象的类是从某个类继承还是实现某个接口,这与GetType()有很大不同。

CodeInChaosStriplingWarrior都对C#中没有not个关键字的原因有合理的解释。

答案 1 :(得分:10)

向语言添加关键字会增加复杂性。在初始规范之后向一种语言添加关键字可能会导致人员升级的重大变化。因此,如果关键字非常强大,通常只会添加关键字。在这种情况下,正如其他答案所指出的那样,使用爆炸操作员非常容易:

if (!(pero is Human)) ...

...一个典型的C#(/ C / C ++ / Java)开发人员会读“如果不是(pero is human)”。因此,特殊关键字没有多少理由。

答案 2 :(得分:5)

注意this.GetType()!= typeof(X)如果派生自(或在接口类型的情况下实现)但与X不相同,则返回false,而this is X返回true。 / p>

当你可以使用!(a is X)时,为什么会有一个单独的关键字?这种语言膨胀,收益甚微。正如Eric Lippert所强调的那样,每个新语言功能都需要提供足够的优势来补偿编码,记录,测试以及语言的复杂性。并且not is运营商提供的资金不足。

你可以实现一个扩展方法,但我认为这很愚蠢:

public static bool IsNot<T>(this object obj)
{
  return !(obj is T);
}

答案 3 :(得分:4)

使用好的'bang符号:

if (!(pero is Human)) 
{

}
BTW,is是不同的,因为它不仅捕获叶派生类,而且捕获它的整个层次结构,包括接口和类。

所以,对于

class Human: ICanSpeak, Mamal
{
...
}

Human h;

if (h is Human)  {   will be true  }
if (h is ICanSpeak)  {  will be true  }
if (h is Mamal) {  will also be true  }