C# is运算符

is运算符

1、is 运算符检查表达式结果的运行时类型是否与给定类型兼容。

2、is 运算符还会对照某个模式测试表达式结果。

写法

is T

其中 E 是返回一个值的表达式,T 是类型或类型参数的名称。E 不得为匿名方法或 Lambda 表达式。

如果表达式结果为非 null 并且满足以下任一条件,则 is 运算符将返回 true

1、表达式结果的运行时类型为 T

示例代码如下所示:

    internal class Program
    {
        public class Base { }

        public class Derived : Base { }

        static void Main(string[] args)
        {
            object b = new Base();
            Console.WriteLine(b is Base);  // output: True
            Console.WriteLine(b is Derived);  // output: False
        }
    }

输出的结果如下图所示:

C# is运算符

查看如下代码:

object b = new Base();
Console.WriteLine(b is Base);  // output: True

虽然在编译期看过去b是object类型,但是在运行时b的类型为Base(),因此b is Base返回True,

而b运行时类型不为Derived,且也不派生自Derived,因此b is Derived返回False。

查看b的类型,使用getType方法,代码如下所示:

    internal class Program
    {
        public class Base { }

        public class Derived : Base { }

        static void Main(string[] args)
        {
            object b = new Base();
            Console.WriteLine(b is Base);  // output: True
            Console.WriteLine(b.GetType());
            Console.WriteLine(b is Derived);  // output: False
        }
    }

运行结果如下图所示:

C# is运算符

2、表达式结果的运行时类型派生自类型 T、实现接口 T,或者存在从其到 T 的另一种隐式引用转换

检查派生关系示例代码如下所示:

 internal class Program
    {
        public class Base { }

        public class Derived : Base { }

        static void Main(string[] args)
        {
            object d = new Derived();
            Console.WriteLine(d is Base);  // output: True
            Console.WriteLine(d.GetType());
            Console.WriteLine(d is Derived); // output: True
        }
    }

运行结果如下图所示:

C# is运算符

可知d的运行时类型为Derived,因此d is Derived结果为True,而Derived派生自Base,因此d is Base结果为True。

检查接口实现示例代码如下所示:

  internal class Program
    {
        interface IDrawable
        {
            void Draw();
        }

        class Circle : IDrawable
        {
            public void Draw()
            {
                // 实现接口的方法
            }
        }

        static void Main(string[] args)
        {
            Circle circle = new Circle();

            Console.WriteLine(circle is IDrawable); // true,因为 Circle 实现了 IDrawable 接口
        }
    }

3、表达式结果的运行时类型是基础类型为 T 且 Nullable.HasValue 为 true 的可为空值类型。

示例代码如下所示:

    internal class Program
    {
      

        static void Main(string[] args)
        {

            int? nullableInt = 42// 创建一个可为空的整数类型

            Console.WriteLine(nullableInt is int?); // true,因为 nullableInt 是 int? 类型,且有值
        }
    }

运行结果如下图所示:

C# is运算符

将代码改写如下:

 internal class Program
    {
      

        static void Main(string[] args)
        {

            int? nullableInt = null// 创建一个可为空的整数类型

            Console.WriteLine(nullableInt is int?); // false,因为 nullableInt 是 int? 类型,但是为null
        }
    }

运行结果如下所示:

C# is运算符

4、存在从表达式结果的运行时类型到类型 T 的装箱或取消装箱转换。

示例代码如下:

    internal class Program
    {
      

        static void Main(string[] args)
        {
            int i = 27;
            Console.WriteLine(i is System.IFormattable);  // output: True

            object iBoxed = i;
            Console.WriteLine(iBoxed is int);  // output: True
            Console.WriteLine(iBoxed is long);  // output: False

        }
    }

运行结果如下所示:C# is运算符

is 运算符还会对照某个模式测试表达式结果。

示例代码如下:

    internal class Program
    {
      

        static void Main(string[] args)
        {
            int i = 25;
            object iBoxed = i;
            int? jNullable = 3;
            if (iBoxed is int a && jNullable is int b)
            {
                Console.WriteLine(a + b);  // output 28
            }

        }
    }

运行结果如下图所示:

C# is运算符

原文始发于微信公众号(DotNet学习交流):C# is运算符

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/230882.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!