c# - 扩大引用类型之间的转换

标签 c# type-conversion reference-type

我知道在扩展转换中,目标数据类型可以保存源数据类型提供的任何值。当转换值类型时我可以理解这一点, 但不能在引用类型之间。我的问题来自以下场景:

public class Person
{
    public string Name { get; set; }
}

public class Employee : Person
{
    public string SurName { get; set; }
}
static void Main(string[] args)
{
    Employee emp = new Employee { Name = "Elvin", SurName = "Mammadov" };
    Person prs = emp;
}

如图所示,Person 类是Empoyee 的祖先类。在之前的代码中,我创建了 Emplyee 类的引用,然后将 Employee 对象转换为 Person。此时,我丢失了 SurName 数据字段和值。

我想知道:

  1. 可以容纳任何值表达式是否有效?

  2. 为什么将引用类型转换为直接或间接祖先类或接口(interface)是扩大转换?

谢谢回复

最佳答案

这被称为“扩大转换”,因为您对引用类型的了解越来越少,而是扩大了潜在类型的集合。当您有 Employee引用您知道,当您有 Person 时,您可以使用特定于该类的任何功能。引用同一对象,您只知道可以使用 Person 中包含的功能类(class)。如果你想使用Employee与您的prs的特定功能引用,您首先必须将引用转换回 Employee引用和如果 prs实际上不是 Employee 类型(也许它的类型是 Customer ,它也继承自 Person )那么你会得到一个 InvalidCastException .

SurName当您处理 Person 时,属性不会消失。引用。您只是无法访问它,因为它不包含在 Person 中。类(class)。基本上,如果您有基类类型的引用,您将只能访问基类中包含的属性/方法。它实际上是一个Employee并不重要。 ,你有一个Person引用,因此对象会被相应地处理。

转换在您的示例中没有用。当您尝试以通用方式使用许多子类时,该转换非常有用。举个例子,我可能有一个 Person类(class)。除此之外我还有 Employee , Customer ,和Consultant从它继承的类。现在假设我有一个 Store对象,我想做一些类似获取每个 Person 的名称目前谁在店里。解决这个问题最简单的方法是有一个 List<Person>和店里的所有人。因为Employee , Customer ,和Consultant全部继承自Person我可以做

peopleInMyStore.Add(MyEmployee);
peopleInMyStore.Add(MyCustomer);
peopleInMyStore.Add(MyConsultant);

然后我可以做类似的事情;

foreach (Person p in peopleInMyStore)
{
     Console.WriteLine(p.Name);
}

这个概念被称为“多态性”,可以在此处阅读 http://en.wikipedia.org/wiki/Polymorphism_(computer_science)

我的示例是人为的,但这是您使用继承的主要原因之一。为了给你一个真实的例子,我有一些测试代码,其中有一个名为 ApiTestSuite 的类。然后我有大约十几个类,它们都继承自它,形式为 SpecificApiTestSuite 。该项目构建为命令行可执行文件,您可以使用 api 参数 (api=specificApiName) 调用它,然后我可以执行类似的操作;

 ApiTestSuite tests;
 if (args[0] == "api1")
     tests = new Api1TestSuite();
 else
     tests = new Api2TestSuite();
 tests.RunTests();

关于c# - 扩大引用类型之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18412712/

相关文章:

c# - 我怎样才能将一串字符转换成二进制字符串然后再转换回来?

Delphi 将字节数组转换为 TBytes - UDP 重定向?

c# - Nullable<> 作为 ViewPage 的 TModel

c# - 在泛型接口(interface)中实现可空类型

c# - 可观察的 CollectionViewSource

c# - ASP.NET Core 3 : Cannot resolve scoped service 'Microsoft.AspNetCore.Identity.UserManager` 1[Alpha. Models.Identity.User]' 来自根提供商

c# - 使用 Mono.Cecil 将方法的主体替换为另一个方法的主体?

string - 在HashMap中将char用作&str

python - python 将字符串转换为 float

javascript - 如何阻止我的函数修改我传入的值?