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

时间:2010-07-02 10:52:17

标签: 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 string GetAge()
  {
     //some code here
  }    
}

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

8 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

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

  

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

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

  

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

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

  

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

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

  

<强> What's the difference between a partial method and a partial class?

答案 3 :(得分: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方法)。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

答案 7 :(得分: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
  }    
}

部分保留在第一堂课之外!