像本例一样,cast对象到接口cast对象到类之间的区别是什么?
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有什么区别?
发布于 2014-05-11 08:41:23
在……里面
IAnimal animal = (Animal)lion;
存在一个隐式转换,因为animal
被声明为IAnimal
,Animal
可以转换为IAnimal
(因为类实现了接口)。
它对应于书写
Lion lion = new Lion();
Animal a = lion;
IAnimal ia = a;
所有这些转换都是可能的。
但是,你也可以这样写:
IAnimal lion = new Lion();
另一方面,如果你写了
var animal = (Animal)lion;
animal
应该是Animal
的一个实例。
发布于 2014-05-11 08:44:34
从字面上讲,编译后的IL中没有区别的。但是,当将Animal
分配给IAnimal
时,存在一个由编译器执行的隐式转换。编译器很乐意这样做,因为它知道Animal
实现了IAnimal
。
这是IL,它显示了我的意思。
IL_0001: newobj UserQuery+Lion..ctor //Create new lion
IL_0006: stloc.0 // store it in variable lion
IL_0007: ldloc.0 // load variable lion
IL_0008: stloc.1 // store it in variable animal
IL_0009: ldloc.0 // load variable lion
IL_000A: stloc.2 // store it in variable animal2
IL_000B: ldloc.1 // load variable animal
IL_000C: callvirt UserQuery+IAnimal.Sound //Call animal.Sound
IL_0011: call System.Console.WriteLine //With the result call Console.WriteLine
发布于 2014-05-11 08:45:35
在第一个示例中,您将执行对Animal
的显式转换,然后进行隐式转换,将其转换为类似于IAnimal animal = (IAnimal)(Animal)lion;
的IAnimal
。第二个示例只是执行隐式转换,对于所有意图和目的,您可以在第二个示例中删除强制转换。
https://stackoverflow.com/questions/23590562
复制相似问题