C# コンパイラ エラー CS0102 の原因と対処法について解説
CS0102は、C#のコンパイルエラーで、同一スコープ内に既に存在する識別子を再定義した場合に発生します。
たとえば、クラス内で同じ名前の変数やメンバーが重複するとこのエラーが出ます。
コード内の重複している識別子の名前を変更し、重複を解消することで対応できます。
エラーCS0102の発生原因
型やメンバーの重複定義
このエラーは、同じクラス内で同一の識別子を複数回定義した場合に発生します。
たとえば、同じクラス内でフィールド、プロパティ、メソッドなどに同じ名前が使われたとき、コンパイラはどの定義を参照するか判断できなくなり、CS0102エラーを出力します。
エラーとなるのは、同じスコープ内で重複する場合です。
クラスレベルでの重複定義
クラスレベルの定義において同じ名前が使われると、クラス全体のスコープで衝突が発生します。
たとえば、次のコードではフィールドとして使用しているs
が重複し、エラーが発生します。
- クラスのメンバー(フィールド、メンバー変数)が同じ名前だと、コンパイラはどちらを使うべきか判断できません。
メソッド内とクラススコープの違い
注意すべきは、メソッド内のローカル変数とクラスレベルのメンバーは、別々のスコープとして扱われる点です。
たとえば、クラス内で定義されたフィールドs
と、メソッド内で定義された変数s
は別物となるため、同名であってもエラーにはなりません。
以下のように、メソッド内で定義されたs
はクラススコープのs
とは独立しています。
名前空間と型の関係
名前空間は、型やクラスを整理・区分する役割を果たしますが、同一の名前空間内で同名の型定義が重複すると、CS0102エラーが発生します。
たとえば、同一名前空間内に同じクラス名の定義が複数ある場合、どちらを参照すべきか不明になるため、このエラーが出力されます。
また、外部ライブラリや自作ライブラリを組み合わせたとき、名前空間の管理が不十分だと意図せず重複する可能性があるため、注意が必要です。
CS0102エラーの解消方法
重複識別子の検出手順
重複識別子が存在する場合、まずはコンパイラエラーメッセージに示された行番号やファイル名を確認して、同じスコープ内に重複する定義がないかを確認します。
以下の手順で検出することができます。
- コンパイルエラーメッセージを確認する
- 問題のファイルと行番号を開く
- 同じスコープ内(クラスレベルや名前空間内)で既に定義されている識別子があるかどうかを調査する
修正方法の具体例
重複を解消するための方法として、識別子の名称変更やクラスの構成見直しがあります。
エラーが発生する部分を特定し、適切な修正を行うことでエラーは解消されます。
識別子の名称変更
重複して定義された識別子の名称を変更することで、衝突を回避します。
たとえば、クラス内でフィールドとして定義しているs
をgreeting
に変更することで、重複を避けることができます。
名前を一意にすることがポイントです。
クラス構成の見直し
場合によっては、クラスの設計自体を見直す必要がある場合もあります。
同じクラス内に複数の役割が混在していると、識別子が重複しやすくなります。
役割ごとにクラスを分割したり、継承やインターフェイスを活用することで、より整理された構造にすることができます。
コード例による検証
エラー発生前のコード例
以下は、重複したフィールド定義によってCS0102エラーが発生する例です。
クラスレベルで同じ名前s
が2回宣言されているため、コンパイルエラーとなります。
using System;
namespace MyApp
{
public class MyClass
{
// フィールドの重複定義によりCS0102エラーが発生する
string s = "こんにちは";
string s = "さようなら"; // 重複定義エラー
public void GetString()
{
// メソッド内の変数はクラスのフィールドとは別のスコープで宣言可能
string s = "再びこんにちは";
Console.WriteLine(s);
}
}
class Program
{
static void Main(string[] args)
{
MyClass instance = new MyClass();
instance.GetString();
}
}
}
コンパイル時にエラー「型 'MyClass' には既に 's' の定義が含まれています」が出力される
エラー解消後のコード例
以下は、識別子の名称変更によって重複を解消した例です。
フィールド名をs
からgreeting
に変更することで、エラーを回避しています。
using System;
namespace MyApp
{
public class MyClass
{
// フィールド名を一意にすることでエラーを回避
string greeting = "こんにちは";
string farewell = "さようなら";
public void GetString()
{
// ローカル変数は引き続きクラスのフィールドと独立したスコープ
string message = "再びこんにちは";
Console.WriteLine(message);
}
}
class Program
{
static void Main(string[] args)
{
MyClass instance = new MyClass();
instance.GetString();
}
}
}
再びこんにちは
まとめ
この記事では、CS0102 エラーの発生原因として、同一スコープ内での識別子の重複や名前空間の関係からくる型の重複定義について説明しています。
重複識別子の検出手順と、識別子の名称変更やクラス構成の見直しによる具体的な修正方法、エラー発生前後のコード例を通して、エラー解消のアプローチを理解できる内容となっています。