0
点赞
收藏
分享

微信扫一扫

C#(十):对象的类型转换


向上转型(隐式类型转换) - 子类转换成父类

  • 向上转型一定成功

Dog dog = new Dog();
Animal animal = dog;
// => Animal animalDog = new Dog();
// => sbyte b = 1; int a = b; => int ab = 1;

class Animal { }
class Dog : Animal { }
class Hashiqi : Dog { }

  • 示例:动物园动物录入

class MainClass
{
public static void Main(string[] args)
{
Animal.RecordAnimal(new Bird()); // 录入动物
// => 详单于
// Animal animal = new Bird(); // 向上转型
// Animal.RecordAnimal(animal);
}
}

class Animal {
public static void RecordAnimal(Animal animal) { }
}
class Bird : Animal { }
class Monkey : Animal { }
class Tiger : Animal { }

  • 向上转型后的对象将不再能够使用子类中特有的字段属性和方法

class MainClass
{
public static void Main(string[] args)
{
Hashiqi hashiqi = new Hashiqi();
hashiqi.type = ""; // ok
hashiqi.sex = ' '; // ok
hashiqi.name = ""; // ok
hashiqi.age = 1; // ok


Dog dog = new Dog();
//dog.type = ""; // Error “Dog”未包含“type”的定义,并且找不到可接受第一个“Dog”类型参数的可访问扩展方法“type”
dog.sex = ' '; // ok
dog.name = ""; // ok
dog.age = 1; // ok

Animal animal = new Animal();
//animal.type = ""; // Error “Animal”未包含“type”的定义,并且找不到可接受第一个“Animal”类型参数的可访问扩展方法“type”
//animal.sex = ' '; // Error “Animal”未包含“sex”的定义,并且找不到可接受第一个“Animal”类型参数的可访问扩展方法“sex”
animal.name = ""; // ok
animal.age = 1; // ok


Animal d = new Hashiqi();
//d.type = ""; // Error “Animal”未包含“type”的定义,并且找不到可接受第一个“Animal”类型参数的可访问扩展方法“type”
//d.sex = ' '; // Error “Animal”未包含“sex”的定义,并且找不到可接受第一个“Animal”类型参数的可访问扩展方法“sex”
d.name = ""; // ok
d.age = 1; // ok

Dog dd = new Hashiqi();
//dd.type = ""; // Error “Dog”未包含“type”的定义,并且找不到可接受第一个“Dog”类型参数的可访问扩展方法“type”
dd.sex = ' '; // ok
dd.name = ""; // ok
dd.age = 1; // ok
}
}

class Animal {
public string name;
public int age;
}
class Dog : Animal {
public char sex;
}
class Hashiqi : Dog {
public string type;
}

向下转型(需要强制类型转换) - 父类转换成子类

  • 如果向下转型失败,那么得到​​null​

// Dog dog = (Dog)new Animal(); // 不推荐
Dog dog = new Animal() as Dog;
Console.WriteLine(dog == null); // True

class Animal { }
class Dog : Animal { }
class Hashiqi : Dog { }

  • 转型成功

class MainClass
{
public static void Main(string[] args)
{
Animal animal = new Dog(); // 向上转型
Dog dog = animal as Dog; // 向下转型

Console.WriteLine(dog); // Dog
Console.WriteLine(dog == null); // False
}
}

class Animal { }
class Dog : Animal { }
class Hashiqi : Dog { }

  • 向下转型错误示例

class MainClass
{
public static void Main(string[] args)
{
Hashiqi hashiqi = new Animal() as Hashiqi; // 向下转型
Console.WriteLine(hashiqi == null); // True
Console.WriteLine(hashiqi.type == null); // Error System.NullReferenceException
}
}

class Animal {
public string name;
public int age;
}
class Dog : Animal {
public char sex;
}
class Hashiqi : Dog {
public string type;
}


举报

相关推荐

0 条评论