C# 同名方法的分部类

C# 同名方法的分部类,c#,partial-classes,C#,Partial Classes,我有一节这样的课 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 str

我有一节这样的课

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
  }    
}

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

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

即使除了语法错误,代码也不会编译。您将得到以下错误:

类型“MyNamespace.ABC”已使用相同的参数类型定义了名为“GetAge”的成员

这是因为编译器会将部分类的所有部分合并为一个单独的类 《C语言规范》第10.2节解释:

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

C#不允许在一个类中使用具有相同名称、相同数量和类型的参数的方法。本规范第1.6.6节对此进行了说明:

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

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


它们不合并:您将有一个编译时错误。

当您尝试编译此代码时,将有一个编译时错误

编译时发生的事情是
编译器将类的所有部分定义中定义的所有成员组合成一个。然后,它将尝试以通常的方式编译它


在您的情况下,它将引发一个错误提到您已经定义了一个同名的方法

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

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

部分类在编译过程中被合并。 编译器查找分部类,并在编译时集成它们。它只是将“两个”分部类合并为一个类。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
method)。

尝试以下方法:

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
  }    
}

把第一节课上的部分内容去掉

如果两个不同的用户在这些类上工作,他们可能会犯这个错误。我如何防止这种情况发生。@Pankaj:让他们互相交谈=)@Pakaj-通过一个好的持续集成系统,不允许他们签入无法编译的代码。@Jens-别傻了,他们是开发人员。也许把它贴在上面,这样,他们很可能会看到它…或者不使用部分类结构来允许不同的开发人员在同一个类上工作-将它作为一个类-让您的源代码管理来处理这个问题(他们就是这么做的)。第一个签入wins,第二个必须合并这些更改。此代码将不起作用,将出现以下错误,“在'ABC'类型的声明中缺少部分修饰符;存在另一个此类型的部分声明”一个现代的警告——如果将部分类拆分为两个单独的文件,即多目标.NET标准类库中的两个单独的平台目标(使用相对较新的“SDK样式”项目系统),那么代码就完全可以了。下面是一个例子。@MarkZhukovsky,谢谢你的评论。我在这里查找.Net Core RuntimeInformation.dll的源代码:我在两个单独的文件中看到相同的属性“OSDescription”实现,谢谢!