像这个例子一样,将对象转换为接口(interface)将对象转换为类有什么区别。
namespace ConsoleApplication1
{
interface IAnimal
{
string Sound();
}
class Animal : IAnimal
{
public string Sound()
{
return "Animal sound";
}
}
class Lion : Animal, IAnimal
{
public string Sound()
{
return "Roarrrrr";
}
}
class Program
{
static void Main(string[] args)
{
Lion lion = new Lion();
IAnimal animal = (Animal)lion; // variant 1
IAnimal animal2 = (IAnimal)lion; // variant 2
Console.WriteLine(animal.Sound());
}
}
}
变体 1 和变体 2 有什么区别?
最佳答案
唯一的区别在于编译器如何检查是否允许转换。
在第一个变体中,编译器检查如何将 Lion
转换为 Animal
,然后检查如何将 Animal
转换为 IAnimal
。由于 Lion
是一个 Animal
而 Animal
是一个 IAnimal
,因此两种转换都可以安全地完成,编译器不会生成根本没有用于转换的代码,它只是一个任务。
在第二个变体中,编译器检查如何将 Lion
转换为 IAnimal
,然后检查 IAnimal
是否与 相同>IAnimal
。由于转换可以安全地完成,它也不会生成用于转换的代码,它也只是一个赋值。
由于 Lion
是一个 IAnimal
,您根本不需要进行任何转换,只需将其分配给变量即可:
IAnimal animal3 = lion;
在这种情况下,编译器将检查如何将 Lion
转换为 IAnimal
,并且由于可以安全地完成,它不会生成任何转换代码,只是作业。
关于c# - Cast 接口(interface)和类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23590562/