繁体   English   中英

具有相同名称方法的部分类

[英]Partial class with same name method

我有一个像这样的局部课

public partial class ABC
{
  public string GetName()
  {
     //some code here
  }

  public string GetAge()
  {
     //some code here
  }    
}

public partial class ABC
{
  public string GetSex()
  {
     //some code here
  }

  public string GetAge()
  {
     //some code here
  }    
}

这两个类在构建时如何合并? 请给我解释一下。

当您尝试编译此代码时,将出现编译时错误

在构建时发生的事情是compiler将在类的所有部分定义中定义的所有成员合并为一个 然后它将尝试以通常的方式编译它。

在您的情况下,它会引发错误,提到您已经定义了具有相同名称的方法

它不能编译,因为在一个类中不能有两个具有相同名称的方法。

即使除了语法错误之外,您的代码也无法编译。 您将收到以下错误:

类型'MyNamespace.ABC'已经定义了一个名为'GetAge'的成员,它具有相同的参数类型

这是因为编译器会将部分类的所有部分合并到一个类中,如C#语言规范的第10.2节所述:

除了部分方法(第10.2.7节)之外,在多个部分中声明的类型的成员集只是每个部分中声明的成员集的并集。 类型声明的所有部分的主体共享相同的声明空间(第3.3节),每个成员的范围(第3.7节)扩展到所有部分的主体。

C#不允许在一个单独的类中使用具有相同名称和相同数量和类型的参数的方法。 这在规范的1.6.6节中说明:

方法的签名在声明方法的类中必须是唯一的。 方法的签名包括方法的名称,类型参数的数量以及数量,修饰符和参数类型。 方法的签名不包括返回类型。

但是有一个选项可以将方法的声明添加到部分类的一部分中,将实现添加到另一部分中部分方法 您可以在Eric Lippert关于该主题的博客文章中阅读有关它们的更多信息:

部分方法和部分类之间有什么区别?

部分类在编译期间合并。 编译器在编译时查找部分类并集成它们。 它只是将“两个”部分类组合成一个类。 CLR中没有对部分类的实现进行任何修改。 您可以将其视为合并“两个”部分类。

例如,对于您的代码,您将拥有:

public partial class ABC
{
  public string GetName()
  {
     //some code here
  }

  public string GetAge()
  {
     //some code here
  }

  public string GetSex()
  {
     //some code here
  }

  public string GetAge()
  {
     //some code here
  }
}

它会给你一个错误,因为你不能有两个具有相同名称和签名的方法(参见GetAge方法)。

它们不合并:您将遇到编译时错误。

它们不会合并:编译时错误。 如果您不小心将它们放在不同的命名空间中,它们可能会合并到您的案例中。

预处理器(或编译器可能)在其中一次运行期间扫描您的项目文件夹,并检查项目中的类名称(或精确的程序集)。 然后它标记了部分类并检查它们是否有多个定义。
向Eric Lippert询问细节。 然后它合并方法,注释,属性,成员,接口等。阅读c#lang规范。 你的方法没有部分修改器,所以在我之前的人注意到,它不会编译。

试试这个:

public class ABC
{
  public string GetName()
  {
    //some code here
  }

  public string GetAge()
  {
    //some code here
  }
}

public partial class ABC
{
  public string GetSex()
  {
    //some code here
  }

  public string GetAge()
  {
    //some code here
  }    
}

部分留在第一堂课!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM