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

dex*_*ter 8 c# compiler-construction types keyword

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

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

 }
Run Code Online (Sandbox Code Playgroud)

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

 if(this is not X) 
 {
     //Do my thing
 }
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 21

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

if (!(this is X)) 
{
    //Do my thing
}
Run Code Online (Sandbox Code Playgroud)

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

无论CodeInChaosStriplingWarrior有为什么没有一个合理的解释not在C#中的关键字.


Str*_*ior 10

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

if (!(pero is Human)) ...
Run Code Online (Sandbox Code Playgroud)

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


Cod*_*aos 5

注意,this.GetType()!= typeof(X),如果这是源自(或在一个接口类型的情况下工具),但不完全相同的X返回false,而this is X返回true.

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

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

public static bool IsNot<T>(this object obj)
{
  return !(obj is T);
}
Run Code Online (Sandbox Code Playgroud)

  • 除了对象的扩展方法是一个有问题的编程实践这一事实,那实际上并不是一个糟糕的小扩展方法.我不是说我会用它,但我认为这是非常合理的. (4认同)
  • @Max:因为很少有一个方法可以处理字符串,整数,老虎,文档,香蕉列表,类型......很有可能,"对象"上的任何扩展方法实际上只是合理的在所有可能对象的一小部分上.这不是一个严格的规则,但它有点代码味道. (3认同)
  • @Eric,请问为什么对象扩展方法被视为不良做法? (2认同)