11

我有这样的部分课程

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

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

4

8 回答 8

18

尝试编译此代码时会出现编译时错误!

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

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

于 2010-07-02T10:56:35.080 回答
7

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

于 2010-07-02T10:55:07.953 回答
2

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

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

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

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

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

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

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

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

于 2010-07-02T10:55:55.687 回答
1

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

于 2010-07-02T11:03:28.647 回答
0

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

于 2010-07-02T10:58:13.263 回答
0

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

于 2010-07-02T11:00:33.927 回答
0

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

于 2010-07-02T10:56:10.180 回答
0

尝试这个:

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

让偏出头等舱

于 2011-12-13T09:58:33.233 回答