C# 转换(is和as运算符)
is运算符
之前已经说过了,有些转换是不成功的,并且会在运行时抛出InvalidCastException异常。
我们可以使用is运算符来检查转换是否会成功完成,从而避免盲目尝试转换。
is运算符的语法如下,其中Expr是源表达式:
如果Expr可以通过以下方式成功转换为目标类型,则运算符返回true:
- 引用转换,
- 装箱转换
- 拆箱转换
例如,在如下代码中,使用is运算符来检测Employee类的变量bill是否能转换为Person
类型,然后进行合适的操作。
class Employee:Person{}class Person
{public string Name="Anonymous";public int Age=25;
}class Program
{static void Main(){Employee bill=new Employee();//检测变量bill是否能转换为Person类型if(bill is Person){Person p=bill;Console.WriteLine($"Person Info:{p.Name},{p.Age}")}}
}
is运算符只可以用于引用转换以及装箱和拆箱转换,不能用于用户自定义转换。
as运算符
as运算符和强制转换运算符类似,只是它不抛出异常。如果转换失败,它返回null而不是
抛出异常。
as运算符的语法如下,其中:
- Expr是源表达式;
- TargetType是目标类型,它必须是引用类型。
由于as运算符返回引用表达式,它可以用作赋值操作中的源。例如,我们使用as把Employee
类型的变量bill转换为Person类型,并且赋值给一个Person类型的变量P。在使用它之前应该
检查p是否为null。
class Employee:Person{}class Person
{public string Name="Anonymous";public int Age=25;
}class Program
{static void Main(){Employee bill=new Employee();Person p;p=bill as Person;if(p!=null){Console.WriteLine($"Person Info:{p.Name},{p.Age}");}}
}
和is运算符类似,as运算符只能用于引用转换和装箱转换,不能用于用户自定义转换或到
值类型的转换。