C# 测试对象是否不是类型

C# 测试对象是否不是类型,c#,syntax,object,testing,C#,Syntax,Object,Testing,我知道如何测试一个对象,看看它是否是一种类型,使用的是关键字,例如 if (foo is bar) { //do something here } 但是你如何测试它呢?不是“bar”?我似乎找不到一个关键字,它可以用来测试一个否定的结果 顺便说一句-我有一种可怕的感觉,这太明显了,所以提前道歉…没有特定的关键字 if (!(foo is bar)) { } if (!(foo is bar)) ... if (foo.GetType() != bar.GetType()) .. // f

我知道如何测试一个对象,看看它是否是一种类型,使用的是关键字,例如

if (foo is bar)
{
  //do something here
}
但是你如何测试它呢?不是“bar”?我似乎找不到一个关键字,它可以用来测试一个否定的结果


顺便说一句-我有一种可怕的感觉,这太明显了,所以提前道歉…

没有特定的关键字

if (!(foo is bar)) {
}
if (!(foo is bar)) ...
if (foo.GetType() != bar.GetType()) .. // foo & bar should be on the same level of type hierarchy
您也可以使用

as运算符用于执行以下操作: 兼容类型之间的转换


您应该澄清是否要测试某个对象正是某个类型,还是可以从某个类型赋值。例如:

public class Foo : Bar {}
假设你有:

Foo foo = new Foo();
如果您想知道foo是否不是Bar(),则可以执行以下操作:

if(!(foo.GetType() == tyepof(Bar))) {...}
但是,如果您想确保foo不是从Bar派生的,那么一个简单的检查就是使用as关键字

Bar bar = foo as Bar;
if(bar == null) {/* foo is not a bar */}

这是个好问题。如果你试过了,但还是想不出来,这并不明显。也就是说,你可能想看看一些C#语法教程,它们会把所有这些东西都拼出来,还有一些你还没有问过自己的东西。我喜欢foo as bar bit,因为如果它是bar,你无疑会想用foo做点什么,所以你最好为这种情况编写代码。这是“神秘而怪异”还是利用了语言特性?
Bar bar = foo as Bar;
if(bar == null) {/* foo is not a bar */}