using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// 1.C# 的隐式和显式转换
///2.C# 通过 Method 进行类型转换
///3.C# 的装箱拆箱和 Nullable 类型
/// </summary>
namespace lesson5
{
class Program
{
static void Main(string[] args)
{
int i = 10;
long l = i;//这里是一个隐式转化 一般是从小的数据类型到大
//或者一个子类到基类
C1 c1 = new C2();
//显式转化则相反 数据可能会丢失
double d = 10.05;
int iFromD = (int)d;//简单的显式转化
C1 c11 = new C1();
try {
C2 c2 = (C2)c11;
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}//异常处理程序
Console.WriteLine(c11 is C1);
Console.WriteLine(c11 is C2);
C2 c22 = c11 as C2;//这里先做了强制转换,然后发现不能就赋值 null, 适用于 非空 和 引用类型
//对比异常抛出机制不消耗资源
Console.WriteLine(c22 == null);
//int iAs="5" as int;
int i2 = 1;
string sFromi = i2.ToString();//通过方法进行转换
//如果想要string转换int 则需要调用Convert这个类
int iFroms = Convert.ToInt32("100");
int iFroms2 = Int32.Parse("101");
//为了避免处理这种输入格式不对的异常,常用
int iFroms3;
bool succeed = Int32.TryParse("iloveunity", out iFroms3);
Console.WriteLine(iFroms3);//没成功输出0
//继承IConventible ,TypeConventer实现自己类型的转换
//装箱和拆箱 装箱时将值类型转变为一个引用类型 拆箱则相反
int iToBoxing = 100;
object iboxed = iToBoxing;//装箱就是一个隐式转换
int iUnboxing = (int)iboxed;//显示转换就是一个拆箱 ,可能会有数据丢失,出错
object NullObject = null;
// int iNull = (int)NullObject; 这里有一个报错
//较为消耗资源
int? iNullable = 100;
System.Nullable<int> inullable2 = 100;
//上面两句话完全等价
Console.WriteLine(iNullable.Value);
iNullable = null;
Console.WriteLine(iNullable.HasValue);
Console.WriteLine(iNullable.GetValueOrDefault());//为空返回0
Console.WriteLine(inullable2.GetValueOrDefault());
int iii = iNullable ?? 500;//如果iNullable为空 赋值iii为后面数值 不为空前面
Console.WriteLine(iFromD);
Console.ReadLine();
}
}
class C1 { }
class C2 : C1 { }
}