【问题标题】:Partial class with same name method同名方法的部分类
【发布时间】:2010-07-02 10:52:17
【问题描述】:

我有一个像这样的部分课程

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

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

【问题讨论】:

    标签: c# partial-classes


    【解决方案1】:

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

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

    在您的情况下,它会引发错误提及您已经定义了同名的方法

    【讨论】:

    • 一个现代警告 - 如果将部分类拆分为 2 个单独的文件,这意味着多目标 .NET Standard 类库中的 2 个单独的平台目标(使用相对较新的“ SDK风格的”项目系统)。这是real example
    • @MarkZhukovsky,感谢您的评论。我正是在这里寻找 .Net Core RuntimeInformation.dll 的源代码:github.com/dotnet/runtime/tree/…,我在 2 个单独的文件中看到了相同的属性“OSDescription”实现,非常感谢!
    【解决方案2】:

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

    【讨论】:

    • 如果有 2 个不同的用户在这些课程上工作,他们可能会犯这个错误。我该如何防止这种情况发生。
    • @Pankaj:让他们互相交谈 =)
    • @Pakaj - 拥有一个良好的持续集成系统,不允许他们签入无法编译的代码。
    • @Jens - 别傻了,他们是开发者。也许把它贴在 SO 上,他们很有可能会看到它......
    • 或者不要使用部分类结构来允许不同的开发人员在同一个类上工作 - 将它作为一个类 - 让你的源代码管理来处理问题(这就是他们所做的)。第一个签入获胜,第二个必须合并更改。
    【解决方案3】:

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

    类型“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?

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              试试这个:

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

              部分排除在第一堂课之外!

              【讨论】:

              • 此代码将不起作用,将给出以下错误,“在声明类型'ABC'时缺少部分修饰符;此类型的另一个部分声明存在”
              猜你喜欢
              • 2014-11-27
              • 1970-01-01
              • 1970-01-01
              • 2020-10-05
              • 1970-01-01
              • 1970-01-01
              • 2016-07-04
              • 1970-01-01
              • 2021-05-05
              相关资源
              最近更新 更多