首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cast接口与类对象

Cast接口与类对象
EN

Stack Overflow用户
提问于 2014-05-11 08:31:38
回答 3查看 127关注 0票数 3

像本例一样,cast对象到接口cast对象到类之间的区别是什么?

代码语言:javascript
运行
复制
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有什么区别?

EN

回答 3

Stack Overflow用户

发布于 2014-05-11 08:41:23

在……里面

代码语言:javascript
运行
复制
IAnimal animal = (Animal)lion;

存在一个隐式转换,因为animal被声明为IAnimalAnimal可以转换为IAnimal (因为类实现了接口)。

它对应于书写

代码语言:javascript
运行
复制
Lion lion = new Lion();
Animal a = lion;
IAnimal ia = a;

所有这些转换都是可能的。

但是,你也可以这样写:

代码语言:javascript
运行
复制
IAnimal lion = new Lion();

另一方面,如果你写了

代码语言:javascript
运行
复制
var animal = (Animal)lion;

animal应该是Animal的一个实例。

票数 3
EN

Stack Overflow用户

发布于 2014-05-11 08:44:34

从字面上讲,编译后的IL中没有区别的。但是,当将Animal分配给IAnimal时,存在一个由编译器执行的隐式转换。编译器很乐意这样做,因为它知道Animal实现了IAnimal

这是IL,它显示了我的意思。

代码语言:javascript
运行
复制
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
票数 3
EN

Stack Overflow用户

发布于 2014-05-11 08:45:35

在第一个示例中,您将执行对Animal的显式转换,然后进行隐式转换,将其转换为类似于IAnimal animal = (IAnimal)(Animal)lion;IAnimal。第二个示例只是执行隐式转换,对于所有意图和目的,您可以在第二个示例中删除强制转换。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23590562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档