C# コンパイラエラー CS1018 の原因と対策について解説
CS1018 は C# のコンパイラエラーです。
コンストラクター宣言が不完全なときに発生し、エラーメッセージは this
または base
の呼び出しが必要なことを伝えています。
コードの見直しにより呼び出し方法を明示することで、このエラーは解消できます。
CS1018 エラーの概要
このセクションでは、コンパイラエラー CS1018 の基本的な内容を理解するための説明を行います。
エラー内容の特徴や背景について、具体例を交えて説明していきます。
エラー内容の理解
エラー CS1018 は「不完全なコンストラクター宣言」が原因で発生します。
これは、コンストラクター宣言において this
または base
といったキーワードが必要な場合に、正しく指定されていないときに起きるエラーです。
this と base の役割
this
と base
は、それぞれ同じクラス内の他のコンストラクターや継承元クラスのコンストラクターを呼び出すためのキーワードです。
this()
は同一クラス内の別のコンストラクターに処理を委譲する際に使用します。base()
は継承元クラスのコンストラクターを呼び出すために使用します。
例えば、以下のサンプルコードでは、this()
を利用して同じクラス内の他のコンストラクターに処理を移譲する方法を示しています。
using System;
public class SampleBase
{
// 継承元クラスのデフォルトコンストラクター
public SampleBase()
{
Console.WriteLine("SampleBase: デフォルトコンストラクター");
}
}
public class SampleDerived : SampleBase
{
// 引数ありコンストラクター
public SampleDerived(int value)
{
Console.WriteLine($"SampleDerived: 引数ありコンストラクター 値 = {value}");
}
// 引数なしコンストラクターで this() を利用して別のコンストラクターに委譲
public SampleDerived() : this(10)
{
// このブロックは別途処理を追加できる
}
public static void Main()
{
// SampleDerived のデフォルトコンストラクターが呼ばれ、this(10) により引数ありが実行される
SampleDerived instance = new SampleDerived();
}
}
SampleDerived: 引数ありコンストラクター 値 = 10
不完全なコンストラクター宣言の問題点
不完全なコンストラクター宣言は、コンストラクター定義の末尾に不要な記号(例えばコロン)が残っていたり、呼び出しすべきキーワードが抜けている場合に発生します。
コンパイラーはコンストラクターがどの処理に委譲されるか明示されていないため、エラーとして警告します。
先ほどのサンプルコード例では、適切な this()
や base()
の記述がないと、次のようなエラーが生じます。
public SampleDerived() : // エラー CS1018 発生: this または base キーワードが必要です
{
}
CS1018 エラーの原因
エラー CS1018 は、記述ミスなどによってコンストラクターの宣言が不完全な場合に発生します。
以下にエラーの原因となるケースを説明します。
宣言ミスによるエラーの発生
コンストラクターの宣言において、this
または base
の呼び出し処理が不正な状態になっている場合、例えば末尾に余計なコロンが存在してしまうことで、コンパイラーは正しい処理の流れが判別できずエラーを出力します。
よく見かける例としては、コロンの後に呼び出し対象が記述されていないケースが挙げられます。
これにより「キーワード ‘this’ または ‘base’ が必要です」というエラーメッセージが発生します。
クラス継承時の注意点
継承関係にあるクラスでは、派生クラスのコンストラクターが継承元のコンストラクターを正しく呼び出す必要があります。
具体的には、継承元クラスに引数なしのコンストラクターが存在しない場合、派生クラスのコンストラクターで明示的に base(引数)
を呼び出す必要があります。
適切な構文が利用されないと、コンパイラーがどのコンストラクターを呼び出すか判断できず、エラーとなります。
CS1018 エラーの対策
このセクションでは、CS1018 エラーを解決するための対策と具体的な修正例について説明します。
エラーの対策には、主に呼び出し対象の明示や不要な記号の削除が挙げられます。
修正方法の検討
エラーの原因を把握した上で、以下の方法で修正を試みることができます。
各対策の具体例をコードとともに示します。
base() 呼び出しによる対処法
もし継承元クラスにパラメーターなしのコンストラクターが定義されている場合は、派生クラスのコンストラクターで base()
を呼び出すことでエラーを解決できます。
using System;
public class ParentClass
{
// 継承元クラスのデフォルトコンストラクター
public ParentClass()
{
Console.WriteLine("ParentClass: デフォルトコンストラクター");
}
}
public class ChildClass : ParentClass
{
// コロンの後に base() を付けることで正しいコンストラクター呼び出しを行う
public ChildClass() : base()
{
Console.WriteLine("ChildClass: デフォルトコンストラクター");
}
public static void Main()
{
ChildClass instance = new ChildClass();
}
}
ParentClass: デフォルトコンストラクター
ChildClass: デフォルトコンストラクター
this() 呼び出しによる対処法
同じクラス内の別のコンストラクターに処理を任せる場合は、this()
を利用します。
これにより、共通の初期化処理を一つのコンストラクターに集約することが可能です。
using System;
public class CustomClass
{
// 引数ありコンストラクター
public CustomClass(int number)
{
Console.WriteLine($"CustomClass: 引数ありコンストラクター number = {number}");
}
// 引数なしコンストラクターで this() を利用して引数ありのコンストラクターへ委譲
public CustomClass() : this(42)
{
Console.WriteLine("CustomClass: 引数なしコンストラクター");
}
public static void Main()
{
CustomClass instance = new CustomClass();
}
}
CustomClass: 引数ありコンストラクター number = 42
CustomClass: 引数なしコンストラクター
コロン削除による修正方法
場合によっては、コロンが不要であるケースもあります。
間違えて記述されたコロンを削除することで、正しいコンストラクター宣言に修正できます。
using System;
public class AnotherClass
{
// 本来、呼び出し処理が不要な場合、コロン自体を削除する
public AnotherClass()
{
Console.WriteLine("AnotherClass: 正しいコンストラクター宣言");
}
public static void Main()
{
AnotherClass instance = new AnotherClass();
}
}
AnotherClass: 正しいコンストラクター宣言
まとめ
CS1018エラーは、コンストラクター宣言における記述ミスが原因で発生するエラーです。
本記事では、this
とbase
の役割や継承時の正しいコンストラクター呼び出しについて解説しました。
また、具体的なサンプルコードを通して、base()
呼び出し、this()
呼び出し、不要なコロン削除による対策方法を示し、エラー解消の実践的な手法が理解できる内容となっています。