Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解上下浇铸c#_C#_Oop - Fatal编程技术网

了解上下浇铸c#

了解上下浇铸c#,c#,oop,C#,Oop,所以我试图理解c#中的上下转换 我的问题是,这个图表是正确的还是我仍然遗漏了什么? 如果不正确,我在哪里可以找到正确表示此概念的图表 非常感谢您的帮助 编辑: 首先,我为混淆道歉,我意识到图表不是很清楚,而且我在向下转换中犯了一个错误(circle2只能访问字符串颜色,它应该可以访问所有属性)。 我会尽力更好地解释我想表达的意思 因此,下面是与之配套的代码: public class Shape { public int Width {g

所以我试图理解c#中的上下转换

我的问题是,这个图表是正确的还是我仍然遗漏了什么? 如果不正确,我在哪里可以找到正确表示此概念的图表

非常感谢您的帮助

编辑: 首先,我为混淆道歉,我意识到图表不是很清楚,而且我在向下转换中犯了一个错误(circle2只能访问字符串颜色,它应该可以访问所有属性)。 我会尽力更好地解释我想表达的意思

因此,下面是与之配套的代码:

        public class Shape 
        {
           public int Width {get;set;}
           public int Height {get;set;}
           public int X {get;set;}
           public int Y {get;set;}
           public void Draw()
           {
             //do something
           }
        }

        public class Circle : Shape 
        {
           public string Colour {get;set;}
        }
        public class Program
        {
            public static void Main(string[] args)
            {
                //Up-casting
                Circle circle = new Circle(); //object is created
                Shape shape = circle; // shape point to circle object

                //Down-casting
                Circle circle2 = (Circle)shape;
            }
        }

你不需要任何图表,只要把基本事实记下来,一切都会变得非常清楚

上上下下都有一个顺序,所以让我们先弄清楚:

在典型的类型层次结构中,我们有以下内容:

Animal -> Vertebrate -> Mammal -> Feline -> Cat
较高或更一般的类型为
Animal
,最低或更具体的类型为
Cat
;因此,顺序就是类型的“一般性”

向上浇铸是指浇铸到更一般的类型,向下浇铸是指浇铸到更特定的类型:

  • 向上投射:
    Animal=new Cat()
  • 向下投射:
    var猫=(猫)动物
好吧,但这两个“演员阵容”都在进行吗?当我们向下或向上投射时,对象会发生什么变化?答案相当简单;没有什么!对对象根本不做任何更改

两种类型转换都是保持身份的引用转换;这意味着强制转换之前和之后的对象是完全相同的对象。顾名思义,您唯一要更改的是指向对象的引用的类型;变量
animal
cat

这一点通过以下操作变得显而易见:
ReferenceEquals(动物、猫科动物)
将返回
true

注意,向上投射总是隐式的,因为它总是安全的;猫始终是猫科动物,而猫科动物始终是哺乳动物等。另一方面,降级必须明确,因为它们不能保证安全:

Animal animal = new Dog();
Feline feline = animal; //unsafe, can not implicitly do the conversion
编译器要求您显式执行强制转换,这是一种告诉编译器“我知道我在做什么,
animal
是一只猫,相信我。”。当然,编译器只会部分信任您,并且仍然会提供运行时保护以确保强制转换是可能的,或者如果不是,则抛出运行时异常。在上面的代码中,强制转换显然会失败,您将得到一个运行时错误


请注意,所有这些仅适用于引用类型。根据定义,值类型没有引用转换,因为无法获取对值类型的引用。这是值类型中不允许类型差异的原因之一;没有保持身份的转换,只有类型差异中允许的转换。

你不需要任何图表,只要把基本事实记下来,一切都会变得非常清楚

上上下下都有一个顺序,所以让我们先弄清楚:

在典型的类型层次结构中,我们有以下内容:

Animal -> Vertebrate -> Mammal -> Feline -> Cat
较高或更一般的类型为
Animal
,最低或更具体的类型为
Cat
;因此,顺序就是类型的“一般性”

向上浇铸是指浇铸到更一般的类型,向下浇铸是指浇铸到更特定的类型:

  • 向上投射:
    Animal=new Cat()
  • 向下投射:
    var猫=(猫)动物
好吧,但这两个“演员阵容”都在进行吗?当我们向下或向上投射时,对象会发生什么变化?答案相当简单;没有什么!对对象根本不做任何更改

两种类型转换都是保持身份的引用转换;这意味着强制转换之前和之后的对象是完全相同的对象。顾名思义,您唯一要更改的是指向对象的引用的类型;变量
animal
cat

这一点通过以下操作变得显而易见:
ReferenceEquals(动物、猫科动物)
将返回
true

注意,向上投射总是隐式的,因为它总是安全的;猫始终是猫科动物,而猫科动物始终是哺乳动物等。另一方面,降级必须明确,因为它们不能保证安全:

Animal animal = new Dog();
Feline feline = animal; //unsafe, can not implicitly do the conversion
编译器要求您显式执行强制转换,这是一种告诉编译器“我知道我在做什么,
animal
是一只猫,相信我。”。当然,编译器只会部分信任您,并且仍然会提供运行时保护以确保强制转换是可能的,或者如果不是,则抛出运行时异常。在上面的代码中,强制转换显然会失败,您将得到一个运行时错误


请注意,所有这些仅适用于引用类型。根据定义,值类型没有引用转换,因为无法获取对值类型的引用。这是值类型中不允许类型差异的原因之一;没有保持身份的转换,类型variance中只允许转换。

图表旁边的代码表示向上转换和向下转换。我不知道图表本身要表示什么。椭圆是否应该表示变量,即对对象的引用?正方形是否表示接口,以及实现这些接口的圆柱体类?我正试图了解更改对象和引用类型的概念。因为据我所知,当向上投射时,圆形和形状指向记忆中的同一个对象/位置?并且形状和圆的所有性质都存在于t中