类之间的转换(总结)
一.隐式转换
- 从任何引用类型到object。
- 从任何类A到其基类B(或着后续基类),也即A派生自B。
- 从任何实现I接口的类A到接口I.
- 从任何接口I1到其基接口I2(或着后续基接口)。
二.显式转换
- 从object到任何其它引用类型。
- 从基类B到其子类A.
- 从任何类A到任何接口I(类A不能被密封,A不实现接口I)
- 从任何接口I到任何类B(类B实现接口I,切不密封)
- 从任何接口I2到任何接口I1(前提是接口I2不是I1派生的)
测试代码如下:
using System;
namespace ConvertClass
{
interface IDatabase
{
void Query();
}
interface IFile
{
void Save();
}
class Document : IFile
{
public void Save()
{
}
}
class Sheet : Document, IFile
{
}
class Test
{
public static void Main()
{
Sheet sheet = new Sheet();
Document doc = sheet; //隐式的转化,子类Sheet到基类Document
IFile file = sheet;//隐式的转化,sheet到实现了的接口IFile
object o = sheet;//隐式的转化,类sheet到object
//======================================================//
//Document doc2 = new Document();
file = doc;//隐式的转化,Document到实现了的接口IFile
object obj = doc;//隐式的转化,类Documnet到object
IDatabase db = (IDatabase)doc;//显式转化,Docunmet不实现接口IDatabase
sheet = (Sheet)obj; //显式转化,从object到sheet类
sheet = (Sheet)file;//显式转化,从接口IFile到实现它的类
file = (IFile)db;//显式转化,接口IFile不是从IDatabase派生的
}
}
}
namespace ConvertClass
{
interface IDatabase
{
void Query();
}
interface IFile
{
void Save();
}
class Document : IFile
{
public void Save()
{
}
}
class Sheet : Document, IFile
{
}
class Test
{
public static void Main()
{
Sheet sheet = new Sheet();
Document doc = sheet; //隐式的转化,子类Sheet到基类Document
IFile file = sheet;//隐式的转化,sheet到实现了的接口IFile
object o = sheet;//隐式的转化,类sheet到object
//======================================================//
//Document doc2 = new Document();
file = doc;//隐式的转化,Document到实现了的接口IFile
object obj = doc;//隐式的转化,类Documnet到object
IDatabase db = (IDatabase)doc;//显式转化,Docunmet不实现接口IDatabase
sheet = (Sheet)obj; //显式转化,从object到sheet类
sheet = (Sheet)file;//显式转化,从接口IFile到实现它的类
file = (IFile)db;//显式转化,接口IFile不是从IDatabase派生的
}
}
}