CS801~2000

C# コンパイラエラー CS1039 の原因と解決方法について解説

CS1039は、C#のコンパイラエラーで、文字列リテラルが正しく終了していない場合に発生します。

コード中で開始の引用符に対応する終了の引用符が不足していると、このエラーが表示されます。

エラーを解決するには、該当箇所に必要な終了の引用符を追加してください。

エラー原因の詳細

文字列リテラルの記述ミス

開始・終了の引用符の不一致

C#の文字列リテラルは"で開始し、必ず"で終了する必要があります。

開始引用符と終了引用符に不一致がある場合、コンパイラは未終了の文字列と判断し、CS1039エラーが発生します。

たとえば、下記のコードは終了引用符が不足しているためエラーとなります。

// 終了引用符が不足しているため、CS1039エラーが発生する例
public class Program {
    public static void Main() {
        string sample = "これは文字列です; // 終了引用符が欠落している
        System.Console.WriteLine(sample);
    }
}
CS1039: 未終了の文字列です

特殊文字のエスケープ誤用

文字列内に特殊文字(たとえば改行やパスのバックスラッシュなど)を記述する場合、適切なエスケープシーケンスを使用する必要があります。

エスケープシーケンスが正しく記述されていないと、コンパイラが文字列リテラルの終了と誤認し、エラーが発生することがあります。

以下の例では、バックスラッシュが正しくエスケープされず、意図しない文字列リテラルとなる可能性があります。

// エスケープシーケンスが正しく記述されていない例
public class Program {
    public static void Main() {
        // "C:\Users\UserName" は正しく記述されていないため、エラーになる可能性がある
        string path = "パスはC:\Users\UserNameです";
        System.Console.WriteLine(path);
    }
}

正しくは、バックスラッシュを2つ重ねてエスケープする必要があります。

例:"パスはC:\\Users\\UserNameです"

@文字列リテラルの注意点

終了引用符省略の事例

@を用いた文字列リテラルは、エスケープシーケンスを無視し、そのまま記述できるため、複数行にわたる文字列を書く際に重宝されます。

しかし、開始引用符に対応する終了引用符を記述し忘れると、同じくCS1039エラーが発生します。

下記の例は@付き文字列リテラルで終了引用符が欠落している場合の例です。

// @付き文字列リテラルで終了引用符が抜けてエラーとなる例
public class Program {
    public static void Main() {
        string message = @"これは複数行に対応した文字列リテラルで
改行も可能ですが、終了引用符が抜けているためエラーになります;
        System.Console.WriteLine(message);
    }
}
CS1039: 未終了の文字列です

エラー発生の具体例

不正なコード記述例

エラー発生前のコード例

以下のコード例は、@付き文字列リテラルで終了引用符が抜けた場合の典型的なエラー例です。

コンパイラは文字列リテラルが完結していないと判断し、エラーを報告します。

// CS1039エラーが発生する例(終了引用符の欠落)
public class MyClass {
    public static void Main() {
        string b = @"hello, world;   // 終了引用符が欠落しているためエラー
        System.Console.WriteLine(b);
    }
}

コンパイラ出力の確認方法

エラーが発生した場合、以下の方法でコンパイラ出力を確認できます。

  • Visual StudioなどのIDEの場合、エラーメッセージが「エラーリスト」に表示されます。
  • コマンドラインでビルドしている場合、コンソールにエラー内容が表示されます。
  • エラーメッセージには、エラーコード(この場合はCS1039)と具体的な説明(未終了の文字列です)が記述されているため、エラー箇所の特定に役立ちます。

エラー修正方法

終了引用符追加による対処

正しい文字列リテラルの記述例

終了引用符を正しく追加することで、このエラーは解消されます。

以下は、修正後の正しいコード例です。

// 修正後の正しいコード例
public class MyClass {
    public static void Main() {
        // 終了引用符が正しく記述されている例
        string b = @"hello, world";
        System.Console.WriteLine(b);
    }
}
hello, world

修正後のコード検証ポイント

修正後に確認するべきポイントは以下の通りです。

  • すべての文字列リテラルに開始引用符と終了引用符が正しく付いているか
  • @付き文字列リテラルの場合も同様に、必ず終了引用符が存在しているか
  • コンパイル時にエラーが発生せず、意図した出力が得られているか

これらのポイントを確認することで、再発を防ぐことができます。

まとめ

この記事では、C#のコンパイラエラーCS1039について、文字列リテラルでの開始・終了引用符の不一致や特殊文字のエスケープ誤用、@付き文字列リテラルの終了引用符省略が原因であることを解説しています。

エラー発生前の不正なコード例や、エラーメッセージの確認方法を示し、終了引用符を追加することでエラーが解消される正しい記述例と検証方法を紹介しています。

関連記事

Back to top button
目次へ