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

このコードをコンパイルしようとすると、コンパイル時エラーが発生します。

ビルド時に発生するのは、クラスのすべての部分的な定義で定義されているすべてのメンバーを1つcompilerに結合することです。その後、通常の方法でコンパイルを試みます。

あなたの場合、同じ名前のメソッドをすでに定義しているというエラーが発生します。

于 2010-07-02T10:56:35.080 に答える
7

1つのクラスに同じ名前の2つのメソッドを含めることはできないため、コンパイルされません。

于 2010-07-02T10:55:07.953 に答える
2

構文エラー以外でも、コードはコンパイルされません。次のエラーが発生します。

タイプ「MyNamespace.ABC」は、同じパラメータタイプで「GetAge」と呼ばれるメンバーをすでに定義しています

これは、C#言語仕様のセクション10.2で説明されているように、コンパイラが部分クラスのすべての部分を1つのクラスにマージするためです。

部分メソッド(§10.2.7)を除いて、複数の部分で宣言された型のメンバーのセットは、単に各部分で宣言されたメンバーのセットの和集合です。型宣言のすべての部分の本体は同じ宣言スペース(§3.3)を共有し、各メンバー(§3.7)の範囲はすべての部分の本体に拡張されます。

C#では、1つのクラス内で同じ名前、同じ数およびタイプの引数を持つメソッドを使用する必要はありません。これは、仕様のセクション1.6.6に記載されています。

メソッドのシグニチャは、メソッドが宣言されているクラスで一意である必要があります。メソッドのシグニチャは、メソッドの名前、タイプパラメータの数、およびそのパラメータの数、修飾子、およびタイプで構成されます。メソッドのシグニチャには、戻り型は含まれていません。

ただし、メソッドの宣言を部分クラスの一部に追加し、実装を別の部分に追加するオプションが1つあります。それは、部分メソッドです。それらについての詳細は、そのトピックに関するEricLippertのブログ投稿で読むことができます。

部分メソッドと部分クラスの違いは何ですか?

于 2010-07-02T10:55:55.687 に答える
1

部分的なクラスは、コンパイル中にマージされます。コンパイラーは部分クラスを探し、コンパイル中にそれらを統合します。「2つの」部分クラスを1つのクラスに結合するだけです。部分クラスの実装のためにCLRで行われる変更はありません。「2つの」部分クラスをマージするのと同じように考えることができます。

たとえば、コードの場合、次のようになります。

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

また、同じ名前と署名を持つ2つのメソッドを使用することはできないため、エラーが発生します(GetAgeメソッドを参照)。

于 2010-07-02T11:03:28.647 に答える
0

それらはマージされません。コンパイル時エラーが発生します。

于 2010-07-02T10:56:10.180 に答える
0

それらはマージされません:コンパイル時エラー。誤って異なる名前空間に配置した場合、それらはマージされる可能性があります。

于 2010-07-02T10:58:13.263 に答える
0

プリプロセッサ(またはコンパイラ)は、実行中にプロジェクトフォルダをスキャンし、プロジェクト(正確にはアセンブリ)にあるクラス名をチェックします。次に、部分的なクラスをマークし、それらの複数の定義があるかどうかをチェックします。
詳細についてはEricLippertにお問い合わせください。次に、メソッド、コメント、属性、メンバー、インターフェイスなどをマージします。c#lang仕様で読み取ります。あなたのメソッドには部分的なmodfierがないので、私の前の人が気付いたように、コンパイルされません。

于 2010-07-02T11:00:33.927 に答える
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 に答える