質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.48%

c# Listの参照わたしでビルドエラー

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,177

score 14

ご指摘の通り、変数名を変えてみました。

overrideは、ややこしいので、削除しました。
しかし、
コントロールが現在のメソッドを抜ける前に割り当てられる必要があります。
といったビルドエラーになります。
エラーのメッセージが言わんとしていることは理解できますが、
変数定義をどう変えればよいのか、わかりません。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace StudyProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("処理を開始します");
            // out を使った場合、変数を初期化不要
            List<string[]> Data = new List<string[]>();
            CsvEdit1 obj1 = new CsvEdit1();
            obj1.ReadCsv(out Data);
            MessageBox.Show("ここでブレークポイントでチェック");
        }
    }

    public class CsvEdit1
    {
        public void ReadCsv(out List<string[]> Data)
        {
            List<string[]> tempData = new List<string[]>();
            try
            {
                // csvファイルを開く
                System.IO.DirectoryInfo dirPath =
                    new System.IO.DirectoryInfo(@"E:/A/");
                System.IO.FileInfo[] files =
                     dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories);
                // 指定フォルダからCSVを取得し、配列に格納する。
                foreach (System.IO.FileInfo filePath in files)
                {
                    using (var readCsv = new System.IO.StreamReader(filePath.FullName))
                    {
                        //ヘッダを読み捨てる。
                        readCsv.ReadLine();
                        // ストリームの末尾まで繰り返す
                        while (!readCsv.EndOfStream)
                        {
                            // ファイルから一行読み込む
                            string line = readCsv.ReadLine();
                            // カンマ区切りで分割して配列に格納する
                            string[] record = line.Split(',');

                            tempData.Add(record);
                        }
                    }
                }
                MessageBox.Show("読み込み完了しました。");
            }
            catch (System.Exception e)
            {
                // ファイルを開くのに失敗したとき
                MessageBox.Show(e.ToString());
            }
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

0

out修飾子で引き渡された変数は、メソッドを抜ける前になんらかの割り当てが行われる必要があります。
詳しくは以下を参照ください。

https://msdn.microsoft.com/ja-jp/library/t3c3bfhx.aspx

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/21 22:15

    y-sakamotoさま

    ありがとうございます。
    msdnをみてみました。

    static void Method(out int i)
    {
    i = 44;
    }
    と同じように、
    かえてみたのですが、どうもうまくいきません。
    out 命令は、配列渡しができないのでしょうか?

    public class CsvEdit1
    {
    public void ReadCsv(out List<string[]> tempData)
    {
    try
    {
    // csvファイルを開く
    System.IO.DirectoryInfo dirPath =
    new System.IO.DirectoryInfo(@"E:/StudyDrive/Desktop/Study/StudyProject/INDATA/");
    System.IO.FileInfo[] files =
    dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories);
    // 指定フォルダからCSVを取得し、配列に格納する。
    foreach (System.IO.FileInfo filePath in files)
    {
    using (var readCsv = new System.IO.StreamReader(filePath.FullName))
    {
    //ヘッダを読み捨てる。
    readCsv.ReadLine();
    // ストリームの末尾まで繰り返す
    while (!readCsv.EndOfStream)
    {
    // ファイルから一行読み込む
    string line = readCsv.ReadLine();
    // カンマ区切りで分割して配列に格納する
    string[] record = line.Split(',');

    tempData.Add(record);
    }
    }
    }
    MessageBox.Show("読み込み完了しました。");
    }
    catch (System.Exception e)
    {
    // ファイルを開くのに失敗したとき
    MessageBox.Show(e.ToString());
    }
    }
    }

    キャンセル

  • 2016/06/21 23:26

    tempDataに値が割りあたっておりません。
    簡素なソースですが、以下のように変更して下さい。

    また予断ではありますが、Listはクラスであるため参照渡しされます。
    その為、質問者様の例ですとそもそもout修飾子がなくとも、Addした値を呼び出し側のメソッドで参照可能です。

    '''C#
    public void RunOutMethod()
    {
    List<string[]> data;
    OutMethod(out data);
    }

    public void OutMethod(out List<string[]> result)
    {
    result = new List<string[]>();
    result.Add(new[] { "test" });
    }
    '''

    キャンセル

  • 2016/06/21 23:37

    上でお話しました、参照渡しについて簡単に検証するソースを書きましたので記載しておきます。
    意味を理解した上で用件にマッチするほうをお使いいただければと思います。


    public void RunReferenceMethod()
    {
    List<string[]> data = new List<string[]>();
    ReferenceMethod(data);

    MessageBox.Show(data[0][0]); //メッセージボックスに「test」と表示されます
    }

    public void ReferenceMethod(List<string[]> result)
    {
    result.Add(new[] { "test" });
    }

    キャンセル

  • 2016/06/22 20:55

    y-sakamotoさま

    ありがとうございます。

    理解できました。

    tempData = new List<string[]>();
    をtryの上で定義することにより、
    class内で、tempDataが有効になり、
    うまくoutで引き渡しできました。

    変数tempDataの定義場所を理解していなかったようです。

    大変勉強になりました。
    ありがとうございます。

    キャンセル

0

引数名と新しく定義している変数の名称が重複しております。
具体的には以下の部分となります

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace StudyProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("処理を開始します");
            // out を使った場合、変数を初期化不要
            List<string[]> stArrayData = new List<string[]>();
            CsvEdit1 obj1 = new CsvEdit1();
            obj1.ReadCsv(out stArrayData);
            MessageBox.Show("ここでブレークポイントでチェック");
        }
    }

    public class CsvEdit1 : CsvEdit
    {
        public override ReadCsv(out List<string[]> stArrayData)        ......ここと
        {
            List<string[]> stArrayData = new List<string[]>();         ......ここです
            try
            {
                // csvファイルを開く
                System.IO.DirectoryInfo dirPath =
                    new System.IO.DirectoryInfo(@"E:/StudyProject/input/");
                System.IO.FileInfo[] files =
                     dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories);
                // 指定フォルダからCSVを取得し、配列に格納する。
                foreach (System.IO.FileInfo filePath in files)
                {
                    using (var readCsv = new System.IO.StreamReader(filePath.FullName))
                    {
                        //ヘッダを読み捨てる。
                        readCsv.ReadLine();
                        // ストリームの末尾まで繰り返す
                        while (!readCsv.EndOfStream)
                        {
                            // ファイルから一行読み込む
                            string line = readCsv.ReadLine();
                            // カンマ区切りで分割して配列に格納する
                            string[] record = line.Split(',');

                            stArrayData.Add(record);
                        }
                    }
                }
                MessageBox.Show("読み込み完了しました。");
            }
            catch (System.Exception e)
            {
                // ファイルを開くのに失敗したとき
                MessageBox.Show(e.ToString());
            }
        }
    }

    public class CsvEdit
    {
        public virtual void ReadCsv()
        {
            List<string[]> stArrayData = new List<string[]>();
            try
            {
                // csvファイルを開く
                System.IO.DirectoryInfo dirPath =
                    new System.IO.DirectoryInfo(@"/");
                System.IO.FileInfo[] files =
                     dirPath.GetFiles("test_*.csv", System.IO.SearchOption.AllDirectories);
                // 指定フォルダからCSVを取得し、配列に格納する。
                foreach (System.IO.FileInfo filePath in files)
                {
                    using (var readCsv = new System.IO.StreamReader(filePath.FullName))
                    {
                        //ヘッダを読み捨てる。
                        readCsv.ReadLine();
                        // ストリームの末尾まで繰り返す
                        while (!readCsv.EndOfStream)
                        {
                            // ファイルから一行読み込む
                            string line = readCsv.ReadLine();
                            // カンマ区切りで分割して配列に格納する
                            string[] record = line.Split(',');

                            stArrayData.Add(record);
                        }
                    }
                }
                MessageBox.Show("読み込み完了しました。");
            }
            catch (System.Exception e)
            {
                // ファイルを開くのに失敗したとき
                MessageBox.Show(e.ToString());
            }
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

out いらないんじゃないですか?

これは戻り値みたいなもので、呼び出す関数でなく、呼ばれた関数で初期化して返すものです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/21 22:12

    Zuishinさま

    いつもありがとうございます。
    outをとってもうまくいきません。
    もうすこし試してみます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る