C# コンパイラ エラー CS1912 の原因と対策について解説
CS1912 は、C# のオブジェクト初期化子で同じメンバーを複数回初期化している場合に発生するエラーです。
たとえば、new TestClass() { memberA = 5, memberA = 6, memberB = 2 }
のように記述すると、memberA
が2回初期化されるためエラーとなります。
各メンバーは1度だけ初期化するようにコードを修正してください。
エラー CS1912 の基本理解
エラー発生の条件と背景
エラー CS1912 は、オブジェクト初期化子で同じメンバーを複数回初期化した場合に発生します。
C# の仕様では、各プロパティやフィールドの初期化は 1 回のみ許可されており、同じメンバーを重複して設定するとコンパイラがエラーを出力します。
このエラーが表示される背景には、コードの記述ミスやリファクタリング時の見落としが考えられます。
コンパイラからは「メンバー ‘name’ の初期化が重複しています」といったエラーメッセージが出力されます。
オブジェクト初期化子のルール
オブジェクト初期化子は、インスタンス生成時にプロパティやフィールドに初期値を設定する手段です。
各メンバーは初期化子内で一度だけ値を割り当てる必要があります。
すなわち、同じメンバーに対して複数の値を設定することは認められません。
また、初期化順序については、クラス定義における順序が影響しないため、コードの可読性を保つためにも、意図しない重複が発生しないよう注意が必要です。
原因の解説
重複初期化のメカニズム
重複初期化が発生すると、コンパイラは同じプロパティに対して複数回の値設定を検知し、どの値を最終的に採用すべきか判断できなくなります。
この仕組み上、重複した初期化記述が存在する場合に CS1912 エラーが発生し、プログラムの意図しない動作や予期せぬ結果を防ぐため、エラーとして扱われます。
エラーの根本原因は、オブジェクト初期化子に含まれる重複したプロパティの記述にあります。
コード例で見るエラー発生ケース
誤った初期化記述の具体例
以下のサンプルコードは、同じプロパティ PropertyA
を 2 回初期化しているため CS1912 エラーが発生する例です。
using System;
public class SampleClass
{
public int PropertyA { get; set; } // プロパティA
public int PropertyB { get; set; } // プロパティB
}
public class Program
{
static void Main()
{
// PropertyAが2回初期化されているためコンパイラ エラー CS1912 が発生する
SampleClass sample = new SampleClass() { PropertyA = 10, PropertyA = 20, PropertyB = 30 };
Console.WriteLine($"PropertyA: {sample.PropertyA}, PropertyB: {sample.PropertyB}");
}
}
コンパイルエラー: メンバー 'PropertyA' の初期化が重複しています
重複初期化による問題の詳細
重複初期化は意図しない値の上書きや不整合を引き起こすため、プログラムの信頼性を大きく損なう可能性があります。
例えば、一方の値に基づいて後続のロジックを実行する場合、期待しない結果が生じることが予測されます。
コードの保守性や可読性を高めるためにも、重複初期化の記述は避ける必要があります。
対策の解説
エラー解消の手順
重複初期化の解消方法
重複初期化エラーを解消するためには、オブジェクト初期化子内で同じメンバーの記述を 1 回に統一する必要があります。
まず、各メンバーの初期化箇所を確認し、重複しているプロパティを特定してください。
その後、正しい値を保持する記述のみ残し、不要な部分を削除します。
正しい記述例の提示
以下のサンプルコードは、重複初期化を解消した正しい記述例です。
PropertyA
は 1 回のみ初期化され、CS1912 エラーが発生しません。
using System;
public class SampleClass
{
public int PropertyA { get; set; } // プロパティA
public int PropertyB { get; set; } // プロパティB
}
public class Program
{
static void Main()
{
// PropertyA の初期化が1回だけ記述されているためエラーは発生しない
SampleClass sample = new SampleClass() { PropertyA = 10, PropertyB = 30 };
Console.WriteLine($"PropertyA: {sample.PropertyA}, PropertyB: {sample.PropertyB}");
}
}
PropertyA: 10, PropertyB: 30
修正時の注意点
修正作業を行う際は、以下の点に注意してください。
- オブジェクト初期化子における各メンバーの記述が一意であるかを確認する
- コードを修正した後、ビルドして意図しないエラーがないかチェックする
- 初期化の順序自体は結果に影響しないが、可読性を保つために統一した記述スタイルを採用する
関連事項
他の初期化エラーとの比較
オブジェクト初期化子に限らず、C# では様々な初期化時のエラーが発生します。
たとえば、コレクション初期化子においても、同じ要素を複数回追加する場合や、要素の型が一致しない場合にエラーが発生することがあります。
それぞれのエラーは初期化記述に関するルール違反から生じるため、ルールを正確に把握しておくことが重要です。
開発環境での確認方法
開発環境(例えば Visual Studio や Visual Studio Code)では、エラーリストや警告機能により CS1912 の発生箇所が明示的に示されます。
コード編集時にリアルタイムでエラーがハイライトされるため、重複初期化の記述に気づきやすくなっています。
また、ビルド時の出力やエラーメッセージを参考にすることで、適切な修正方法を迅速に見出すことが可能です。
まとめ
この記事では、オブジェクト初期化子で同じメンバーを複数回設定することによる CS1912 エラーの発生条件と背景、エラーの原因となる重複初期化の仕組みについて解説しています。
具体的なコード例を通して誤った記述とその問題点を示し、エラー解消のための正しい記述方法や修正時の注意点、他の初期化エラーとの違いや開発環境での確認方法についても説明しています。
これにより、エラー発生時の対処法を理解し、適切に修正できる知識が得られます。