主要内容
- 类型的转换构造器
- 显式/隐式的转换操作符
1. 类型的转换构造器
类型转换构造器是指 通过一种类型(比如Type1)的实例来构造另一种类型(比如Type2)的实例。
一般用于:
1) Type1和Type2之间没有继承关系,但是仍然希望从Type1转换到Type2
2) Type1和Type2是完全不同的两种类型
使用方法如下:
using System;
namespace cnblog_bowen
{
public class CLRviaCSharp_8
{
static void Main(string[] args)
{
Type1 t1 = new Type1(10);
t1.Show();
// 通过Type1 来构造 Type2
Type2 t2 = new Type2(t1);
t2.Show();
Console.ReadKey(true);
}
}
public class Type1
{
private Int32 type1_n;
public int Type1_n { get { return type1_n; } }
public Type1(Int32 n)
{
type1_n = n;
}
public void Show()
{
Console.WriteLine("type1_n = " + type1_n.ToString());
}
}
public class Type2
{
private Int32 type2_n;
// 类型转换构造器,根据Type1来构造Type2
public Type2(Type1 t1)
{
type2_n = t1.Type1_n + 10;
}
public void Show()
{
Console.WriteLine("type2_n = " + type2_n.ToString());
}
}
}
显示结果如下:
2. 显式/隐式的转换操作符
我们可以看出 通过构造器来完成类型的转换并不是很灵活。
其实C#中还提供了显示和隐式的转换方法。
隐式转换的代码如下:
using System;
namespace cnblog_bowen
{
public class CLRviaCSharp_8
{
static void Main(string[] args)
{
Type1 t1 = new Type1(10);
t1.Show();
// 通过隐式转换将Type1转为Type2
Type2 t2 = t1;
t2.Show();
Console.ReadKey(true);
}
}
public class Type1
{
private Int32 type1_n;
public int Type1_n { get { return type1_n; } }
public Type1(Int32 n)
{
type1_n = n;
}
public void Show()
{
Console.WriteLine("type1_n = " + type1_n.ToString());
}
}
public class Type2
{
private Int32 type2_n;
// 类型转换构造器,根据Type1来构造Type2
public Type2(Type1 t1)
{
type2_n = t1.Type1_n + 10;
}
// implicit关键字表示是隐式转换
public static implicit operator Type2(Type1 t1)
{
return new Type2(t1);
}
public void Show()
{
Console.WriteLine("type2_n = " + type2_n.ToString());
}
}
}
显式转换的代码如下:
using System;
namespace cnblog_bowen
{
public class CLRviaCSharp_8
{
static void Main(string[] args)
{
Type1 t1 = new Type1(10);
t1.Show();
// 通过显式转换将Type1转为Type2
Type2 t2 = (Type2)t1;
t2.Show();
Console.ReadKey(true);
}
}
public class Type1
{
private Int32 type1_n;
public int Type1_n { get { return type1_n; } }
public Type1(Int32 n)
{
type1_n = n;
}
public void Show()
{
Console.WriteLine("type1_n = " + type1_n.ToString());
}
}
public class Type2
{
private Int32 type2_n;
// 类型转换构造器,根据Type1来构造Type2
public Type2(Type1 t1)
{
type2_n = t1.Type1_n + 10;
}
// explicit关键字表示是显式转换
public static explicit operator Type2(Type1 t1)
{
return new Type2(t1);
}
public void Show()
{
Console.WriteLine("type2_n = " + type2_n.ToString());
}
}
}
通过显式/隐式转换操作符来进行类型转换时需要注意两点:
1)显式/隐式转换函数必须是public的
2)显式/隐式转换函数必须是static的
为了更好的理解转换操作符和操作符重载方法,强烈建议将System.Decimal类型作为一个典型来研究。