質問するログイン新規登録

Q&A

解決済

2回答

15552閲覧

型 'string[]' を 'System.Collections.Generic.List<string>' に暗黙的に変換できません

ryohasegawa

総合スコア437

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2017/06/28 12:57

0

0

配列 Cfile はいくつ配列ができるかわからないので、public List<string> Cfile = new List<string>(); と宣言&初期化を行いました。
そして、このサイトで紹介されている方法でファイルのパスを配列で所得したのをグローバル変数である Cfile に代入(Cfile = ofd.FileNames;)しようとしたところ、 型 'string[]' を 'System.Collections.Generic.List<string>' に暗黙的に変換できませんというエラーに出会いました。
これをネットで検索してみると、他の型の事例が出てたんですが、理解できませんでした。
解決策と説明していただけないでしょうか?

気になる質問をクリップする

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

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

guest

回答2

0

List<T>.AddRange メソッドを使えばいいのでは?

投稿2017/06/28 14:02

YAmaGNZ

総合スコア10702

ryohasegawa

2017/06/28 14:26

それも一つの方法ですね。ありがとうございます。
guest

0

ベストアンサー

何故 List<string> 型を使っているのか分かりませんが、Cfile = ofd.FileNames; というようなことはできないのはエラーメッセージの通りなのですが・・・

public List<string> Cfile = new List<string>(); は削除して、string[] Cfile = new List<string>(); とすべきと思いますが、そうできない事情がありますか?

【訂正】

コメント欄に書きましたが、すみません、上記は間違いでした。

誤:public List<string> Cfile = new List<string>(); は削除して、string[] Cfile = new List<string>();

正:public List<string> Cfile = new List<string>(); は削除して、string[] Cfile = ofd.FileNames;

でした。

質問者さんの最初の方のコメントに対してレスします。

理由は配列を初期化する際に 配列名[値] 値を入れないといけないと思うのですが、その値が決まらない場合

FileDialog.FileNames プロパティは String 型の配列のオブジェクト(インスタンス)を作って、それへの参照を返します。つまり、質問者さんが気にしている「配列の初期化」は FileDialog.FileNames プロパティの中で行われます。

なので、質問者さんが行う必要があるのは、FileDialog.FileNames プロパティが返す String 型の配列のオブジェクトへの参照を保持する変数を宣言することだけで、それが string[] Cfile です。

つまり、

string[] Cfile = ofd.FileNames;

は、質問者さんが宣言した変数 Cfile に、.NET Framework のライブラリが ofd.FileNames によって生成した String 型の配列のオブジェクトへの参照を代入していることになります。(値型と参照型の違いに注意してください。今回は参照型の話です)

あとは、Cfile[0], Cfile[1] ... とか、foreach (string filename in Cfile) とかで各要素を取得できます。

ファイルがもしあとから追加された場合困ります

その場合は、その後でもう一度 ofd.FileNames として追加されたファイルの名前を含めて String 型の配列のオブジェクトを取得できます。

投稿2017/06/28 13:22

編集2017/06/28 14:20
退会済みユーザー

退会済みユーザー

総合スコア0

ryohasegawa

2017/06/28 13:35

何故 List<string> 型を使っている << 理由は配列を初期化する際に 配列名[値] 値を入れないといけないと思うのですが、その値が決まらない場合、今回の場合は、ファイルを選択して、その選択されたファイル数で初期化をしてたのですが、ファイルがもしあとから追加された場合困ります。なので、あとからでも追加できるようにと思い調べたら、動的配列という存在を知り、調べて見ると、 List<string> Cfile = new List<string>() でする方法があったので、自分のコードに取り入れました。
ryohasegawa

2017/06/28 13:37

public List<string> Cfile = new List<string>(); は削除して、string[] Cfile = new List<string>(); とすべきと思いますが << コードを書き換えてみたんですが、new List<string>() の所で、型 'System.Collections.Generic.List<string>' を 'string[]' に暗黙的に変換できません というエラーが出てしまいます・・・・
退会済みユーザー

退会済みユーザー

2017/06/28 13:49

すみません、間違えました。 誤:public List<string> Cfile = new List<string>(); は削除して、string[] Cfile = new List<string>(); 正:public List<string> Cfile = new List<string>(); は削除して、string[] Cfile = ofd.FileNames; でした。回答欄の方も訂正しておきます。
ryohasegawa

2017/06/28 14:14

できました。 初期化と同時に代入をしているんですか?
退会済みユーザー

退会済みユーザー

2017/06/28 14:28

> 初期化と同時に代入をしているんですか? 回答欄に追記しましたが、ofd.FileNames は String 型の配列のオブジェクトを生成しそれへの参照を返します。string[] Cfile で参照を保持する変数 Cfile を宣言します。そして、= で Cfile に ofd.FileNames が生成したオブジェクトへの参照を代入ということになります。
ryohasegawa

2017/06/28 14:34

理解できました。 あと一つ気になっているのが、string[0]~string[3]には、既に選択したファイルの情報が入っているとします。そこで、新しく選択されたファイルの情報が追加される場合string[4]以降に追加されていくのですか?
退会済みユーザー

退会済みユーザー

2017/06/28 14:39

それは分からないです。MSDN ライブラリを見る限りですが、そのことはドキュメント化されてませんし。
YAmaGNZ

2017/06/28 15:08

「新しく選択されたファイル」というのをしっかり定義したほうがいいのではないかと思います。 1回目にダイアログを開いた時の選択で「A、B、C」と3つのファイルを選択し 2回目にダイアログを開いた時の選択で「D」の1つのファイルを選択した場合に ofd.FileNames[0]=A ofd.FileNames[1]=B ofd.FileNames[2]=C ofd.FileNames[3]=D となると期待しているのであれば、話は違うと思います。
ryohasegawa

2017/06/29 05:29

YAmaGNZ さんの言っているようにするのが理想です。 こうするには、一つ一つfor文で回していって、データが既にあれば、続きから代入されるように書かないといけないですか?
YAmaGNZ

2017/06/29 05:38

SurferOnWwwさんがおっしゃられているのは 1回目にダイアログを開いた時の選択で「A、B、C」と3つのファイルを選択し 2回目にダイアログを開いた時の選択で「A、B、C、D」の4つのファイルを選択した場合に ofd.FileNamesの配列の順番についてはドキュメントに記述されていない ということだと思い、コメントさせていただきました。(もし異なるなら申し訳ありません) 複数回ダイアログを開いて、その度に選択されたファイルを追加していくのであれば、 私はList<string>を選択したほうがいいのではないかと思います。
退会済みユーザー

退会済みユーザー

2017/06/29 09:11 編集

表題や最初の質問内容と話がずれてきているように思います。そういう場合は、新たに別スレッドを立てて質問するのがお勧めです。一つの疑問に対する答えが次の疑問(表題とは別の)を生んで、一つのスレッドの中で質問・回答を繰り返すのはここのような know-how の蓄積も目的にしているサイトでは歓迎されないやり方ですので。(後で検索なのでここにたどり着いた人のことを考えると、そうする方が望ましいと理解いただけると思います)
ryohasegawa

2017/06/29 06:32

そうですね。もう少し考えた後質問し直したいと思います。
ryohasegawa

2017/06/30 05:08

ちなみになんですが、ファイルを追加した場合の処理書けました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問