目录
1.用户自定义转换
用户自定义转换的语法如下:
public static implicit operator TargetType(SourceType Identifier)
{
...
return ObjectOfTargetType;
}
有两点要说明一下:
- 除了implicit和explicit关键字之外,显示和隐式转换的声明语法一样
- 无论显示还是隐式转换都需要public和static修饰符
例如下面代码给出了一个转换语法的示例,它将一个Person类型的对象转换为int
public static implicit operator int(Person p)
{
return p.Age;
}
用户自定义转换也有一些约束:
- 只可以为类和结构定义转换
- 不能重定义标准隐式转换或显示转换,如int转double
- 对于源类型S和目标类型T,
- S和T必须是不同类型
- S和T不能通过继承关联,也就是S不能从T继承,T也不能从S继承
- S和T都不能是接口类型或者Object类型
- 转换运算符必须要是S或T的成员
- 对于相同的源和目标类型,我们不能声明隐式转换和显示转换
自定义隐式转换的示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestSelfdefinedTrans
{
class Employee : Person { }
class Person
{
public string Name;
public int Age;
//将Person对象转换为Int
public static implicit operator int(Person p)
{
return p.Age;
}
}
class Program
{
static void Main(string[] args)
{
Employee bill = new Employee();
bill.Name = "Wlilliam";
bill.Age = 25;
float fVar = bill; //将Employ转化为float
Console.WriteLine("person Info:{0},{1}", bill.Name, fVar);
}
}
}
2.is操作符
并不是所有转换都会成功的,有些转换是不成功的,并且会在运行时跑出一个InvalidCastException异常,我们可以使用is运算符来检查转换是否会转换成功,从而避免盲目转换。语法如下:
Expr is TargetType
如果可以通过以下方式成功转换为目标类型,运算符返回True
- 引用转换
- 装箱转换
- 拆箱转换
所以对于前面的例子:判断Empl类型能不能转换为Person类型可以有
if(bill is Person)
{
...
}
3.as 操作符
as 运算符和强制转换运算符类似,只是不跑出异常。如果转换失败,它返还null而不是抛出异常。语法如下:
Expr as TargetType
Expr 是源类型, TargetType是目标类型
由于as运算符返回引用表达式,它可以用作赋值操作中的源
所以对于is操作符而言,可以类似
Person p= bill as Person;
if(p!=null)
{
...
}
和is运算符类似,as运算符只能用于引用转换和装箱转换,不能用于用户自定义的转换或到值类型的转换。