这是一个愚蠢的问题,但您可以使用这段代码来检查某项是否为特定类型…

if (child is IContainer) { //....

是否有更优雅的方法来检查“NOT”实例?

if (!(child is IContainer)) { //A little ugly... silly, yes I know...

//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) { 
if (child aint IContainer) { 
if (child isnotafreaking IContainer) { 

是的,是的……愚蠢的问题……

因为有一些关于代码看起来像什么的问题,它只是一个简单的返回方法的开始。

public void Update(DocumentPart part) {
    part.Update();
    if (!(DocumentPart is IContainer)) { return; }
    foreach(DocumentPart child in ((IContainer)part).Children) {
       //...etc...

当前回答

新增在c# 9.0中

https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/#logical-patterns

if (part is not IContainer)
{
    return;
}

原来的答案

这一点还没有被提及。它可以工作,我认为它看起来比使用更好!

if (part is IContainer is false)
{
    return;
}

其他回答

新增在c# 9.0中

https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/#logical-patterns

if (part is not IContainer)
{
    return;
}

原来的答案

这一点还没有被提及。它可以工作,我认为它看起来比使用更好!

if (part is IContainer is false)
{
    return;
}

扩展方法IsNot<T>是一种扩展语法的好方法。记住

var container = child as IContainer;
if(container != null)
{
  // do something w/ contianer
}

表现得比做

if(child is IContainer)
{
  var container = child as IContainer;
  // do something w/ container
}

在您的情况下,这并不重要,因为您正在从方法返回。换句话说,要注意不要同时进行类型检查和类型转换。

is操作符的计算结果是布尔值,因此您可以执行任何在bool类型上能够执行的操作。否定它使用!操作符。为什么要用不同的运算符呢?

虽然IS操作符通常是最好的方法,但在某些情况下,您可以使用另一种替代方法。您可以使用as操作符并测试为空。

MyClass mc = foo as MyClass;
if ( mc == null ) { }
else {}

你可以这样做:

object a = new StreamWriter("c:\\temp\\test.txt");

if (a is TextReader == false)
{
   Console.WriteLine("failed");
}