C#コンパイラエラーCS0060の原因と解決方法について解説
CS0060は、C#のコンパイラで発生するエラーです。
継承関係にあるクラス間で、基底クラスのアクセス修飾子が派生クラスより低いとエラーが起こります。
エラーメッセージに従い、両クラスのアクセシビリティを一致させるよう修正すると解消できます。
エラーCS0060の原因解説
アクセス修飾子の基本
基底クラスと派生クラスの役割
C#において、基底クラスは共通する機能やプロパティをまとめた設計部品として機能し、派生クラスは基底クラスの機能を引き継ぎながら、特有の処理や拡張を行います。
アクセス修飾子は各クラスがどの範囲で利用可能かを指定するために用いられ、基底クラスと派生クラスの関係性においては、基底クラスの可視性が派生クラス以上でなければなりません。
たとえば、基底クラスが内部クラスinternal
で定義されている場合、派生クラスにおいても同じかそれ以上のアクセスレベル(例えばpublic
)で宣言すると矛盾が生じ、エラーが発生する可能性があります。
アクセスレベルの不一致が引き起こす問題
アクセス修飾子の不一致とは、基底クラスの可視性が派生クラスよりも低く設定される状況を指します。
この状態では、派生クラスが基底クラスの機能にアクセスできなくなるため、継承の意味が失われます。
式で表すと、基底クラスのアクセスレベルを
を満たす必要があるという考え方に基づいています。
このルールに違反すると、コンパイラはエラーCS0060を出力し、アクセス修飾子の設定を見直すよう促します。
不一致によるエラー発生例
エラーメッセージの詳細解析
エラーCS0060が発生すると、コンパイラは「アクセシビリティに一貫性がありません」といったメッセージを提示します。
具体的には、メッセージ内で基底クラスと派生クラスの名前が示され、基底クラスの可視性が低く設定されていることを指摘します。
この警告は、クラスの利用に制約が出るため、プログラム全体の設計に影響を与える可能性があるため、速やかに修正する必要があります。
エラーCS0060の発生パターンの検証
コンパイル時のエラー状況
サンプルコードに見る再現例
以下は、基底クラスのアクセス修飾子が意図せず低いままになっている例です。
このケースでは、派生クラスが基底クラスから継承しようとするためエラーが発生します。
// CS0060.cs
// 基底クラスはデフォルトのアクセス修飾子(private相当)となるため、外部から利用できません
class MyClass
{
// クラス内の内容:例として簡単なメッセージを保持します
public string Message { get; set; } = "基底クラスからのメッセージ";
}
// 派生クラスはpublicとして宣言しており、基底クラスの可視性との不一致が発生します
public class MyClass2 : MyClass
{
public static void Main()
{
// MyClassのインスタンスが利用できない問題を確認するためのコード
MyClass2 instance = new MyClass2();
System.Console.WriteLine(instance.Message);
}
}
// 出力結果(理想的には解決された状態での確認用)
// CS0060エラー発生のため出力はありません
問題箇所の特定方法
エラーメッセージを読むときは、以下の点に注意してコードを確認します。
- 基底クラスの宣言部をチェックし、アクセス修飾子が省略されていないか確認する。
- 派生クラスの宣言部のアクセス修飾子と整合性が取れているか検証する。
- ソースコード全体で利用されるクラス名の一貫性と設計方針を確認する。
これにより、どのクラスのアクセス修飾子が原因でエラーが生じているかを迅速に特定できます。
CS0060の解決方法について解説
アクセシビリティ調整の手法
修正前後のコード比較
アクセス修飾子の不一致を解消するための基本的な方法は、基底クラスの修飾子を派生クラスと整合するように変更することです。
以下に修正前と修正後のコードの違いを示します。
修正前のコードでは、基底クラスMyClass
のアクセス修飾子が省略されています。
そのため、暗黙的にinternal
またはprivate
扱いとなり、派生クラスMyClass2
のpublic
宣言と矛盾してエラーが発生します。
// 修正前のコード
class MyClass
{
public string Message { get; set; } = "基底クラスからのメッセージ";
}
public class MyClass2 : MyClass
{
public static void Main()
{
MyClass2 instance = new MyClass2();
System.Console.WriteLine(instance.Message);
}
}
修正後のコードでは、基底クラスにもpublic
を付与することで、派生クラスとのアクセス整合性が取れ、エラーが解消されます。
// 修正後のコード
public class MyClass
{
public string Message { get; set; } = "基底クラスからのメッセージ";
}
public class MyClass2 : MyClass
{
public static void Main()
{
MyClass2 instance = new MyClass2();
System.Console.WriteLine(instance.Message);
}
}
// 修正後の出力結果
基底クラスからのメッセージ
変更ポイントの具体的な解説
修正の要点は、基底クラスMyClass
にpublic
アクセス修飾子を追加する点です。
これにより、MyClass
はどのプロジェクト内からも利用可能になり、MyClass2
が継承を行ってもアクセス修飾子の矛盾が解消されます。
アクセス修飾子の整合性を保つことは、プログラム全体のアーキテクチャにとって重要な側面です。
エラー修正時の確認事項
チェックすべきコード部分
エラー修正時には、以下の点を中心に確認します。
- すべての基底クラスの宣言部のアクセス修飾子が適切であるか。
- 派生クラスと基底クラスのアクセス修飾子の整合性が保たれているか。
- 他の外部クラスやメソッドで、修正によって意図しないアクセスが発生していないか。
これらの確認事項により、エラーCS0060の根本原因を正確に把握し、無理がない形で修正を適用できます。
作業手順の整理方法
エラー修正の手順は以下のとおりです。
- エラーメッセージを詳細に確認し、基底クラスと派生クラスのアクセス修飾子を把握する。
- 対象のクラスの宣言部において、各クラスのアクセス修飾子設定を確認する。
- 基底クラスのアクセシビリティを必要に応じて変更し、すべての継承関係が整合する状態にする。
- コード全体をビルドし、再度エラーが解除されているか検証する。
これらの手順を順番に実行することで、問題箇所が明確になり、エラーの再発防止につながります。
まとめ
本記事では、C#コンパイラエラーCS0060の原因として、基底クラスと派生クラス間のアクセス修飾子設定の不一致があることを解説しました。
サンプルコードを用い、エラーメッセージの解析、修正前後のコード比較、および具体的な変更ポイントを示すことで、適切なアクセス修飾子設定の重要性を理解できる内容となりました。