CS801~2000

C# コンパイラエラー CS1018 の原因と対策について解説

CS1018 は C# のコンパイラエラーです。

コンストラクター宣言が不完全なときに発生し、エラーメッセージは this または base の呼び出しが必要なことを伝えています。

コードの見直しにより呼び出し方法を明示することで、このエラーは解消できます。

CS1018 エラーの概要

このセクションでは、コンパイラエラー CS1018 の基本的な内容を理解するための説明を行います。

エラー内容の特徴や背景について、具体例を交えて説明していきます。

エラー内容の理解

エラー CS1018 は「不完全なコンストラクター宣言」が原因で発生します。

これは、コンストラクター宣言において this または base といったキーワードが必要な場合に、正しく指定されていないときに起きるエラーです。

this と base の役割

thisbase は、それぞれ同じクラス内の他のコンストラクターや継承元クラスのコンストラクターを呼び出すためのキーワードです。

  • 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エラーは、コンストラクター宣言における記述ミスが原因で発生するエラーです。

本記事では、thisbaseの役割や継承時の正しいコンストラクター呼び出しについて解説しました。

また、具体的なサンプルコードを通して、base()呼び出し、this()呼び出し、不要なコロン削除による対策方法を示し、エラー解消の実践的な手法が理解できる内容となっています。

関連記事

Back to top button
目次へ