CS801~2000

C# CS1928エラーの原因と対策について解説

CS1928エラーは、C#でメソッドを呼び出す際に、対象の型にその定義が存在しなかったり、最適なオーバーロードの候補で無効な引数が含まれている場合に発生します。

コンパイラが正しいシグニチャのメソッドを見つけられないため、このエラーが表示されます。

メソッドの定義や引数の指定を確認することで対処できます。

CS1928エラーの発生要因

オーバーロード解決の仕組みと問題点

メソッドシグネチャの不一致

メソッドのシグネチャは、メソッド名に加えて引数の数や型が定義される部分です。

シグネチャが一致しない場合、コンパイラはどのメソッドを呼び出すべきか判断できず、CS1928エラーにつながることがあります。

以下のサンプルコードは、正しいシグネチャによる呼び出しと、不一致が原因となる可能性のある例を示しています。

using System;
class Sample
{
    // 正しいシグネチャのメソッド
    public void PrintMessage(string message)
    {
        // メッセージを出力
        Console.WriteLine(message);
    }
    // 仮にシグネチャが不一致の場合、以下のようなメソッドが定義されると混乱の原因となる可能性があります
    // public void PrintMessage(int number) { ... }
}
class Program
{
    static void Main()
    {
        Sample sample = new Sample();
        // 正しい呼び出し
        sample.PrintMessage("こんにちは");
        // 以下の呼び出しは、存在しないシグネチャを指定しているためコンパイルエラーになります
        // sample.PrintMessage(123);
    }
}
こんにちは

存在しないメソッド呼び出し

メソッド自体が定義されていない場合や、拡張メソッドの候補を探しても適合するものが見つからない場合に、CS1928エラーが発生します。

たとえば、元々存在しないメソッド名を呼び出すと、コンパイラは適切なオーバーロードを見つけられずにエラーと判断します。

以下の例では、正しく拡張メソッドを呼び出す方法を示しています。

using System;
static class Extensions
{
    // 文字列型向けの拡張メソッド
    public static void Display(this string text)
    {
        Console.WriteLine(text);
    }
}
class Program
{
    static void Main()
    {
        string message = "拡張メソッドの呼び出し";
        // 正しい呼び出し
        message.Display();
        // 以下は、存在しないメソッドを呼び出す例です
        // message.PrintMessage();
    }
}
拡張メソッドの呼び出し

引数の不適切な指定

型の不一致によるエラー

呼び出す際に指定する引数の型が、メソッド定義で期待される型と異なる場合、型変換が暗黙的に行われないとエラーが発生します。

以下のサンプルコードは、正しい型での呼び出しと、型の不一致が原因となるエラーの例を示しています。

using System;
class Calculator
{
    // 整数型を引数にとる正しいメソッド定義
    public int Add(int a, int b)
    {
        return a + b;
    }
}
class Program
{
    static void Main()
    {
        Calculator calc = new Calculator();
        // 正しい呼び出し(整数型の引数)
        int result = calc.Add(2, 3);
        Console.WriteLine(result);
        // 以下の呼び出しは、引数の型が違うためエラーとなります
        // int wrongResult = calc.Add("2", "3");
    }
}
5

無効な引数組み合わせの検出

引数の数や組み合わせが、メソッド定義と一致しない場合にもエラーが生じます。

すなわち、必要な引数が不足していたり、余分な引数が渡されたりすると、コンパイラは正しいオーバーロードを決定できずエラーを出します。

以下の例は、定義された引数の数に従った正しい呼び出しと、誤った呼び出しの例です。

using System;
class Converter
{
    // 引数の数が固定されているメソッド
    public double ToDouble(int value)
    {
        return (double)value;
    }
}
class Program
{
    static void Main()
    {
        Converter converter = new Converter();
        double correctConversion = converter.ToDouble(10);
        Console.WriteLine(correctConversion);
        // 以下の呼び出しは、引数が足りない/多すぎるためエラーとなります
        // double errorConversion = converter.ToDouble(10, 20);
    }
}
10

エラーメッセージの詳細

CS1928エラーコードの意義

コンパイラエラーとの関連性

CS1928エラーは、メソッド呼び出し時に指定された引数が、最適なオーバーロードと一致しない場合に発生するエラーです。

コンパイラは、利用可能なオーバーロードの中から最も適切なものを選択しようと試みますが、どの候補も完全には一致しない場合、エラーメッセージとしてこのコードが出力されます。

エラー内容から、どの引数が問題となっているかを確認し、正しいシグネチャに修正する必要があります。

エラーメッセージの読み取り方法

コンパイラのエラーメッセージには、エラーコードとともに問題の詳細が記述されています。

たとえば、エラーメッセージに以下のような文言が含まれている場合、

「CS1928: Type には method の定義が含まれず、最適なメソッド オーバーロード method に、いくつかの無効な引数があります。」

このメッセージは、呼び出し側で指定している引数の型や数が、利用可能なオーバーロードの定義と一致していないことを示唆しています。

エラーメッセージを正確に読み解くことで、どの部分を修正すべきかを判断できます。

対策の詳細

メソッド定義の見直し

シグネチャと引数の整合性確認

メソッド定義において、シグネチャ(メソッド名、引数の型および数)が正しいかどうかを確認することが重要です。

呼び出し時に使用する引数の型や順序が、実際の定義と一致しているかを再チェックしてください。

以下は、シグネチャの整合性が明確な例です。

using System;
class Logger
{
    // メソッドの引数の型と順序が正しく定義されている
    public void Log(string message, int level)
    {
        Console.WriteLine($"レベル {level}: {message}");
    }
}
class Program
{
    static void Main()
    {
        Logger logger = new Logger();
        // 正しい呼び出し。引数の型と順序が一致しています
        logger.Log("正常な呼び出し", 1);
        // 以下の呼び出しは、引数の順序が逆なためシグネチャ不一致となりエラーを引き起こす可能性があります
        // logger.Log(1, "誤った呼び出し");
    }
}
レベル 1: 正常な呼び出し

適切な型変換の実施方法

引数の型が一致しない場合、明示的な型変換やキャストを行うことで、エラーの解決につながる場合があります。

プログラム内で使用する型の整合性を保つために、必要に応じて(int)(double)などのキャストを利用してください。

以下はその例です。

using System;
class Parser
{
    // int型の引数を受け取るメソッド
    public void ProcessNumber(int number)
    {
        Console.WriteLine($"数値: {number}");
    }
}
class Program
{
    static void Main()
    {
        Parser parser = new Parser();
        object obj = 42;
        // 明示的なキャストにより、型の不一致を解消して呼び出す
        parser.ProcessNumber((int)obj);
        // 以下はキャストを行わずに呼び出す例で、型不一致によりエラーが発生します
        // parser.ProcessNumber(obj);
    }
}
数値: 42

呼び出し部分の修正

オーバーロード候補の適正選択

複数のオーバーロードが存在する場合、呼び出し時に渡す引数の型や順序が適切であることを確認する必要があります。

適切な引数を指定することで、コンパイラは正しいオーバーロード候補を選択し、CS1928エラーを回避します。

以下は整数型と文字列型の両方に対応したオーバーロードの例です。

using System;
class Formatter
{
    public string Format(int number)
    {
        return $"整数: {number}";
    }
    public string Format(string text)
    {
        return $"文字列: {text}";
    }
}
class Program
{
    static void Main()
    {
        Formatter formatter = new Formatter();
        // 引数の型に応じて適切なオーバーロードが選択されます
        Console.WriteLine(formatter.Format(100));
        Console.WriteLine(formatter.Format("サンプル"));
        // 以下の例は、適切なオーバーロード候補が存在しないためエラーとなります
        // Console.WriteLine(formatter.Format(3.14));
    }
}
整数: 100
文字列: サンプル

引数指定の修正例

メソッド呼び出しにおいて、引数が不足している場合や余分な引数を渡している場合、正しい形へ修正する必要があります。

引数の数を見直し、定義と一致するように修正することで、エラーが解消されます。

以下の例では、正しい引数の数で呼び出す方法を示しています。

using System;
class Calculator
{
    // 2つの引数を期待しているメソッド
    public int Multiply(int a, int b)
    {
        return a * b;
    }
}
class Program
{
    static void Main()
    {
        Calculator calc = new Calculator();
        // 正しい呼び出し。指定された引数の数が定義と一致しています
        Console.WriteLine(calc.Multiply(4, 5));
        // 以下の呼び出しは、引数の数が不足しているためエラーとなります
        // Console.WriteLine(calc.Multiply(4));
    }
}
20

デバッグと検証の手法

エラーメッセージ解析の進め方

発生箇所の特定方法

エラーメッセージに記載された行番号やファイル名を参考に、エラーが発生している箇所を特定します。

IDEのデバッガやビルド時のログ出力を利用すれば、どの部分で不整合が発生しているかを迅速に把握できます。

以下の例は、正しい型で呼び出されている場合と、型不一致が原因となる例を比較したものです。

using System;
class Debugger
{
    public void Analyze(string data)
    {
        // 受け取ったデータを出力して確認
        Console.WriteLine($"入力データ: {data}");
    }
}
class Program
{
    static void Main()
    {
        Debugger debugger = new Debugger();
        // 正しい呼び出し:文字列型のデータを渡しています
        debugger.Analyze("テストデータ");
        // 以下は型が一致しない例で、エラー箇所の特定に役立つ情報となります
        // debugger.Analyze(123);
    }
}
入力データ: テストデータ

修正前後の挙動比較

エラー修正前と修正後のプログラムの挙動を比較することで、修正が正しく適用されているか確認できます。

デバッグ時は、修正前の状態ではエラーが発生し、修正後は正常に動作することを確認してください。

以下の例では、数値の加算が正しく行われるか比較しています。

using System;
class Sample
{
    // 正しい引数の型で加算を実施するメソッド
    public int Add(int a, int b)
    {
        return a + b;
    }
}
class Program
{
    static void Main()
    {
        Sample sample = new Sample();
        // 修正前の呼び出し例(例として不適切な型が使用される場合)
        // int wrongResult = sample.Add("5", "10");
        // 修正後の正しい呼び出し
        int correctResult = sample.Add(5, 10);
        Console.WriteLine($"加算結果: {correctResult}");
    }
}
加算結果: 15

変更後の動作確認

テスト環境での検証方法

コード修正後は、テスト環境で実際に動作確認を行い、エラーが解消されているか確認しましょう。

単体テストや統合テストを活用して、各メソッドが正しい動作をしているか自動化されたテストで検証することが効果的です。

下記の例は、NUnitを利用した基本的なテストの例となります。

using System;
using NUnit.Framework;
[TestFixture]
public class OperationTests
{
    [Test]
    public void Add_ValidInput_ReturnsCorrectResult()
    {
        // Arrange
        Sample sample = new Sample();
        // Act
        int result = sample.Add(2, 3);
        // Assert
        Assert.AreEqual(5, result);
    }
}
// 単体テスト用のサンプルクラス
public class Sample
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}
class Program
{
    static void Main()
    {
        // テストはNUnitコンソールランナーなどの外部ツールを用いて実行してください
        Console.WriteLine("テストは外部ツールで実行します。");
    }
}
テストは外部ツールで実行します。

改善効果の確認手順

コード修正後、コンパイル時に警告やエラーがなくなったこと、そして実行結果が期待通りになっていることを確認します。

具体的には、各メソッド呼び出し箇所をテストし、出力結果が事前に想定したものと一致しているかをチェックしてください。

また、修正前後で実行速度やリソース使用量に変化がないかも確認することで、他の問題が生じていないか検証します。

まとめ

この記事では、CS1928エラーの原因として、オーバーロード解決時のメソッドシグネチャの不一致や存在しないメソッド呼び出し、引数の型不一致や組み合わせエラーがあることを解説しています。

また、コンパイラのエラーメッセージの読み解き方、メソッド定義の見直しや呼び出し部分の修正、さらに、デバッグと検証の具体的な手法を示すサンプルコードを通じて、エラー解消への実践的対策が理解できる内容となっています。

関連記事

Back to top button
目次へ