プログラミングとかブログ

Unity/C#/SRPGStudio/RPGツクールMVの情報とかその他気になったことを調べて書きます。

C#超・初心者が知っておくべき10のエラー

コピペ追記中心のC#超初心者がハマりそうなエラーを10個集めました。
f:id:shirakamisauto:20160126142650p:plain
目次(各エラー名は適当です)

;が足りないエラー

CS1002 ;が必要です
CS1002 ;expected
f:id:shirakamisauto:20160122191056p:plain
発生例:

string str = "YJSNPI"
Console.Writeline(str);

このエラーが出たら以下のように文末に;をつける必要があります。
修正例:

string str = "YJSNPI";//←「;」をつけた
Console.Writeline(str);

}が足りないエラー

CS1513 } が必要です。
CS1513 } expected
f:id:shirakamisauto:20160122191102p:plain
発生例:

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine();
        }
    
}

「{」と「}」は必ずセットで使います。
例では「class Program」の「}」が足りません。
下記のように「}」を追加すると直ります。
修正例:

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine();
        }
    }//←「}」をつけた
}

単品記述エラー

cs0201 割り当て、呼び出し、インクリメント、デクリメント、新しいオブジェクトの式のみがステートメントとして使用できます。
CS0201 Only assignment, call, increment, decrement, and new object expressions can be used as a statement
f:id:shirakamisauto:20160122191144p:plain
発生例:

2 * 3;
a==9;

;をつけたコードを、n=9,Console.Writeline()、i++,i--,new Test()という書き方以外で書いたときに出ます。

参考
Compiler Error CS0201

型違いエラー

CS0029 型 'type' を型 'type' に変換できません。
CS0029 Cannot implicitly convert type 'type' to 'type'
f:id:shirakamisauto:20160122191207p:plain
発生例:

int x = "TNOK";

変数(例ではx)には型(type)があります。
その型にあった値しか入れられません。
これだとint(整数)型にstring(文字列)型の値を入れてしまっています。
修正例:

int x = 893;

型に合った値を入れましょう。

参考
ufcpp.net

未宣言使用・入力ミスエラー

cs0103 現在のコンテキストにxxxという名前は存在しません。
CS0103 The name 'xxx' does not exist in the current context
f:id:shirakamisauto:20160122191200p:plain
発生例:

        class Program
        {
            static void Main(string[] args)
            {
                b = 9;
                NoViolent();
            }
        }

なんとなくテキトーに書くと出やすいです。
頭の中でこうしたいと思ってもプログラムは書いたとおりにしか動きません。
以下のように「これは何か」を前もって宣言しないとプログラムにはわからないのです。
修正例:

        class Program
        {
            static void Main(string[] args)
            {
                int b = 9;//←型を宣言している
                NoViolent();
            }

            static void NoViolent()//←メソッドの中身を書いている
            {
                return;
            }
        }

打ち間違い(typo)したときも出やすいです。

参考
Compiler Error CS0103

using参照無いエラー

CS0246 型または名前空間名 'xxxx' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。
CS0246 The type or namespace name 'xxxx' could not be found (are you missing a using directive or an assembly reference?)
f:id:shirakamisauto:20160122191133p:plain
発生例:

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dt;
        }
    }
}

コード中に書かれてない型(例ではDateTime)が使われています。
こういうのは誰かが用意したやつを持ってきて使っています。

DateTimeはSystemというコードにあります。
Systemから持ってくるには「どこから持ってきたか」をプログラム内に書く必要があります。
そのためにコードの先頭にusing System;というふうに書きます。(usingディレクティブ)
修正例:

using System;//←usingディレクティブを付けた
namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dt;
        }
    }
}

System.DateTime dt;のように直接書いてもいいです。(アセンブリ参照)

どこから持ってきているか分からない場合は検索したりオブジェクトブラウザを使うといいでしょう。
shirakamisauto.hatenablog.com

参考
Compiler Error CS0246

インデックスエラー

型 'System.IndexOutOfRangeException' のハンドルされていない例外が ConsoleApplication2.exe で発生しました
インデックスが配列の境界外です。
f:id:shirakamisauto:20160122191213p:plain
発生例:

	int[] array = { 1, 3, 8 };
        int n = array[3];//←データがないところを見てしまっている

int[] array = { 1, 3, 8 };は配列型といって一つの変数に複数のデータを入れられます。
データはarray[0]に1、array[1]に3、array[2]に8と入っています。
array[3]やarray[4]・・・には入っていません。
入っていないところをどうこうしようとするとエラーになります。

参考
ufcpp.net

static内で非static使用エラー

CS0120 静的でないフィールド、メソッド、またはプロパティ 'xxxxxx' で、オブジェクト参照が必要です。
CS0120 An object reference is required for the non-static field, method, or property 'xxxxxx'
f:id:shirakamisauto:20160122191234p:plain
発生例:

        class Program
        {
            int b = 9;

            static void Main(string[] args)
            {
		b=1;
                NoAction();
            }

            void NoAction()
            {
                return;
            }
        }

頭にstaticがついたやつ(例ではstatic void Main(string[] args))の中でstaticと頭についていない変数(例ではb)やメソッド(例ではNoAction)を使うとエラーになります。
修正例:

        class Program
        {
            static int b = 9;//←頭にstaticを付けた

            static void Main(string[] args)
            {
		b=1;
                NoAction();
            }

            static void NoAction()//←頭にstaticを付けた
            {
                return;
            }
        }

頭にstaticを付けると動くようにはなります。
ただ、public staticを付けるとどこからでも使えてしまうようになって混乱のもとになることがあるので多用は注意です。*1
個人的にちょっとしたプログラムを書くぐらいなら大して問題はないです。

エントリポイント多重エラー

CS0017 プログラムで複数のエントリ ポイントが定義されています。エントリ ポイントを含む型を指定するには、/main でコンパイルしてください。
CS0017 Program has more than one entry point defined. Compile with /main to specify the type that contains the entry point.
f:id:shirakamisauto:20160122191249p:plain
発生例:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine();
        }

        static void Main(string[] args)
        {
            Console.WriteLine();
        }
    }

プログラムが動くときには最初に動かすスタート地点が必要です。
それがエントリポイントです。
スタート地点がいくつもあると、どこからプログラムを動かしていいかわからなくなります。
で、このエラーが出ます。
通常はMainメソッドになっているので同じMainメソッドをコピペしたりするとこのエラーが出ます。
コピペしたほうの名前を変えてあげましょう。
修正例:

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine();
        }

        static void Mamorultu(string[] args)//←名前を変えた
        {
            Console.WriteLine();
        }
    }

アクセス制限エラー

cs0122 xxxxはアクセスできない保護レベルになっています
CS0122 'xxxx' is inaccessible due to its protection level
f:id:shirakamisauto:20160122191303p:plain
発生例:

namespace ConsoleApplication
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine();
        }
    }

    class Kbs
    {
        void Trio()
        {
            Program.Main();//←ここからMain()は使えない
        }
    }
}

他のclassのもの(例では「class Program」の中の「static void Main()」)を使うことができないように制限されているときがあります。
頭にpublicがついていないとなることが多いです。
修正例:

namespace ConsoleApplication
{
    class Program
    {
        public static void Main()//←publicを付けた
        {
            Console.WriteLine();
        }
    }

    class Kbs
    {
        void Trio()
        {
            Program.Main();
        }
    }
}

なんでもpublic付ければいいと言うわけではないので注意。
参考
ufcpp.net

おわりに*2

C#つーかほぼVisual Studioコンパイラエラーですが。
正直10じゃきかないとは思いますが無理やり絞りました。
あれがないこれがないってのがあってもご容赦ください。

C#超初心者というかプログラミング超初心者を想定しているのでゆるふわな書き方になってます。
初心者はとりま動かして先へ進んでから後で理解すりゃいいってスタンスなんで、誤解ある書き方になってても

_人人人人人人_
> 仕様です <
 ̄Y^Y^Y^Y^Y^ ̄



*1:別にpublic staticを使っていい時もある。また、staticの利用は本当はそれ以外にも注意が必要なんだけど全部書こうとするとオブジェクト指向とか関係してきて1記事分ぐらいいるのでこのくらいで。

*2:言い訳ともいう