CS401~800

C#コンパイラエラーCS0548の原因と対策を解説

CS0548はC#のコンパイラエラーで、プロパティやインデクサーにgetまたはsetアクセサーが一つも定義されていない場合に表示されます。

アクセサーを正しく追加することで、エラーを解消できます。

エラー発生状況

エラーメッセージの確認

CS0548 エラーは、プロパティまたはインデクサーに少なくとも 1 つのアクセサーget または setが定義されていない場合に発生します。

コンパイル時には以下のようなエラーメッセージが表示されます。

'MyProp' : プロパティまたはインデクサーには、少なくとも 1 つのアクセサーが必要です

このメッセージから、アクセサーが未定義であることが原因であると判断できます。

アクセサー未定義の場合のコード例

以下は、アクセサーが未定義のプロパティを含むコード例です。

コード内のコメントにも日本語の説明を付けています。

using System;
public class MyClass
{
    // アクセサーが定義されていないプロパティ。CS0548 エラーが発生します。
    public int MyProp {}
    // 正しく定義されたプロパティ
    public int ValidProp
    {
        get
        {
            return 42; // 値を返す処理
        }
        set
        {
            // 値の設定処理
        }
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        MyClass instance = new MyClass();
        // ValidProp を利用して正常な動作を確認
        instance.ValidProp = 10;
        Console.WriteLine(instance.ValidProp);
    }
}

実行結果の例は以下です。

10

コンパイル時の出力内容

上記のコードをコンパイルしようとすると、MyProp に対してアクセサーが未定義であるため、以下のようなエラーが出力されます。

CS0548: 'MyProp' : プロパティまたはインデクサーには、少なくとも 1 つのアクセサーが必要です

エラーメッセージにより、プロパティにアクセサーを付与する必要があることが明示されます。

コード例に見るエラー現象

コード例を見ると、アクセサーが全く定義されていない MyProp の部分が問題となっています。

下記の点に注意してください。

  • プロパティ定義後に {} とだけ記載するだけでは、アクセサーの実装が不十分となりエラーが発生します。
  • 同じクラス内に正しく実装されたプロパティ(例:ValidProp)がある場合、基本的な実装方法が確認できます。
  • エラー発生箇所を特定し、どのアクセサーが不足しているかを理解することが重要です。

エラーの原因

プロパティにおけるアクセサー欠如

C# のプロパティは、値の取得または設定のために get または set のいずれかを実装する必要があります。

アクセサーを一切定義しない場合、コンパイラは有効なプロパティとして認識できず、CS0548 エラーを出力します。

このエラーは、プロパティを宣言する際の仕様漏れが原因です。

たとえば、単に以下のようにプロパティ名と中括弧だけを記載するとエラーとなります。

public int MyProp {}

インデクサーでのアクセサー不足

プロパティと同様に、インデクサーにも少なくとも 1 つのアクセサーget または setが必要です。

インデクサーの場合、配列風のアクセスを可能にするための実装が求められます。

アクセサーが不足すると、CS0548 エラーがインデクサー定義時にも発生する可能性があります。

必要なアクセサーを忘れずに定義することが重要です。

エラー解消方法

アクセサー追加による修正手順

アクセサーの不足が原因で発生するエラーを解決するためには、該当するプロパティまたはインデクサーに get または set のいずれか、または両方を追加する必要があります。

以下では getset の各アクセサーを実装する例を示します。

getアクセサーの実装例

get アクセサーを実装することで、プロパティを通じて値を取得できるようになります。

以下のコードは、returnValue を返すプロパティの例です。

using System;
public class MyClass
{
    private int returnValue = 100;  // 内部状態を保持する変数
    // get アクセサーを実装して値を返すプロパティ
    public int MyProp
    {
        get
        {
            return returnValue;  // 内部変数の値を返す
        }
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        MyClass instance = new MyClass();
        // MyProp を利用して値を取得
        Console.WriteLine(instance.MyProp);
    }
}

実行結果の例は以下です。

100

setアクセサーの実装例

set アクセサーを実装することで、プロパティを通じて値を設定できるようになります。

以下は、外部から値を設定するプロパティの例です。

using System;
public class MyClass
{
    private int storage;  // 内部状態
    // set アクセサーを実装して値を更新するプロパティ
    public int MyProp
    {
        get
        {
            return storage;  // 現在の値を返す
        }
        set
        {
            storage = value;  // 受け取った値を内部変数に格納
        }
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        MyClass instance = new MyClass();
        // MyProp に値を設定
        instance.MyProp = 55;
        Console.WriteLine(instance.MyProp);
    }
}

実行結果の例は以下です。

55

修正後のコード例と検証方法

以下は、アクセサーを正しく実装したプロパティを含む修正済みのコード例です。

コード内では ValidProp を両アクセサー付きで実装しており、エラーが解消されたことを確認できます。

using System;
public class MyClass
{
    private int valueHolder;  // 内部状態管理用の変数
    // 両方のアクセサーを実装したプロパティ
    public int ValidProp
    {
        get
        {
            return valueHolder;  // 現在の値を返す
        }
        set
        {
            valueHolder = value;  // 受け取った値を内部変数に格納する
        }
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        MyClass instance = new MyClass();
        // ValidProp に値を設定してから取得する
        instance.ValidProp = 77;
        Console.WriteLine(instance.ValidProp);
    }
}

実行結果の例は以下の通りです。

77

上記の修正済みコードをコンパイルし、実行することで、エラーが解消されたことを確認できます。

エラーメッセージが出力されずに、正しく値が取得および設定される動作が実現されます。

まとめ

本記事では、CS0548エラーの原因であるプロパティやインデクサーにおけるアクセサー欠如の状況を解説しました。

アクセサーが未実装の場合のエラーメッセージや、その解消方法としてのgetおよびsetアクセサーの実装例を示し、修正後のコードと検証方法についても説明しました。

これにより、CS0548エラーの原因と解消手法が理解できるようになります。

関連記事

Back to top button
目次へ