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