none
Data の配列を返す関数 RRS feed

  • 質問

  • こんなことが出来ずに困っています。

    以下の関数がエラーです。

            private string[] GetTheAlphabet(int num)
            {
                switch (num)
                {
                    case 1:
                        return { "A", "B" };
                    case 2
                        return {"A","B","C"};
                    case 3
                        return {"A","B","C","D"};
                }
            }
    これがエラーになりますが、何がおかしいのでしょうか?

    基礎中の基礎かとは思いますが、よろしくお願いします。

    2010年10月30日 14:44

回答

  • コンパイルエラーのメッセージがちょっと分かりづらいですね。

    配列の初期化の記述で、new を使わずに書けるのは変数の宣言と初期化を同時に行うときのみです。つまり、

    string[] a = { "a", "b" };

    は変数 a の宣言と a の初期化が同時に行われているので書けますが、

    string[] a;

    a = { "a", "b" }

    は書けません。

    直接 return の後ろに書くのも、そもそも変数の宣言がないので書けません。省略せずに

    return new string[] { "a", "b" }

    と記述する必要があります。

    // C# のバージョンによっては(3.0 からだっけ?)、new[] { "a", "b" } と記述することはできます。

    • 回答としてマーク yasheeki 2010年10月30日 17:22
    2010年10月30日 15:09

すべての返信

  • ”エラーになる”というだけでなく、どのようなエラーが出るかは明示するべきです。
    また、どういったことを試した、調べた、考えたかも一緒に添えるようにしてください。

    基礎中の基礎だと自分でわかっているのであれば、調べること、考えることも重要です。
    調べた、考えた結果でわからなかったのであれば、その努力の過程を知れると、今後はこうやって調べたら良いとか、考えたら良いとかアドバイスを得られるかもしれません。

    さて、この例、3 つくらい問題があります。

    ・そもそも、: が足りてません。
    ・return new string[] { "A", "B" }; なら通りますよね。VC#2008 なら、return new [] { "A", "B"}; とかでも。
    ・num が 0 以下や 4 以上だったら、この関数はどのような動きをするか考えてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年10月30日 15:04
    モデレータ
  • コンパイルエラーのメッセージがちょっと分かりづらいですね。

    配列の初期化の記述で、new を使わずに書けるのは変数の宣言と初期化を同時に行うときのみです。つまり、

    string[] a = { "a", "b" };

    は変数 a の宣言と a の初期化が同時に行われているので書けますが、

    string[] a;

    a = { "a", "b" }

    は書けません。

    直接 return の後ろに書くのも、そもそも変数の宣言がないので書けません。省略せずに

    return new string[] { "a", "b" }

    と記述する必要があります。

    // C# のバージョンによっては(3.0 からだっけ?)、new[] { "a", "b" } と記述することはできます。

    • 回答としてマーク yasheeki 2010年10月30日 17:22
    2010年10月30日 15:09
  • 皆様、申し訳ありませんでした。

            public string[] GetTheAlphabet(int num)
            {
                switch (num)
                {
                    case 1:
                        return new [] { "A", "B" };
                    case 2:
                        return new [] { A", "B", "C" };
                    case 2:
                        return new [] { "A", "B", "C", "D" };
                    default:
                        return null;
                }
            }
    というもので、解決しました。が、new演算子を使うことが理解できていなかったのでした。

    また、Azulean さんのおっしゃる通り、コロンが足りていませんでしたし、default の記述もなく、全くでたらめで恥ずかしい限りです。
    そして、配列の初期化の記述にnew演算子を付けていなのが問題でした。

    この3つの他に、ちょっと離れるとすぐに忘れてしまう個人的でもっとも重要な大問題があったことも否めません、です。

    2010年10月30日 17:22
  • エラーメッセージは仕方がないです。{}は配列初期化の他に、ブロックと解釈することもできます。

    void Main(){
      {
        Console.WriteLine( "Hello, World." );
      }
    }

    構文が間違っていた時に、コンパイラが、どちらの可能性が高いかまで推論させるのは酷でしょう。

    2010年10月30日 23:52