ListViewItemCollection
ジェネリックICollection<T>
またはIEnumerable<T>
インターフェイスを実装していないため、コンパイラはItems
コレクションを見て型を推測できません。したがって、使用する代わりにforeach
型のコレクションを反復処理していることをループに明示的に伝える必要があるのはなぜですか。ListViewItem
var
したがって、次のコードが機能します。
var myPlayList =
axWindowsMediaPlayer1.playlistCollection.newPlaylist("MyPlayList");
foreach (ListViewItem media in listView1.Items)
{
var mediaItem = axWindowsMediaPlayer1.newMedia(media.Text);
myPlayList.appendItem(mediaItem);
}
axWindowsMediaPlayer1.currentPlaylist = myPlayList;
暗黙的に型指定された変数 ( )を使用listView1.Items
してforeach
ループ内を反復処理すると、は のように扱われます。したがって、 を呼び出すときは、実際には で呼び出していることになります。他の多くの .NET クラスと同様に、メソッドをオーバーライドします。次のようになります。var
media
object
ToString()
ListViewItem
ListViewItem
System.Object.ToString()
public override string ToString()
{
return "ListViewItem: {" + this.Text + "}";
}
foreach (var media in listView1.Items)
したがって、使用して呼び出すときに何が起こるかaxWindowsMediaPlayer1.newMedia(media.ToString())
は、実際axWindowsMediaPlayer1.newMedia("ListViewItem: { C:\\Users\\...\\file.mp3 }";)
には明らかに機能しない呼び出しです。
ただし、次のコードのように、var
繰り返し処理する各アイテムを にキャストすることで、正常に使用できます。ListViewItem
foreach (var media in listView1.Items)
{
var fileLocation = (ListViewItem)media; // This step is critical!
var mediaItem = axWindowsMediaPlayer1.newMedia(fileLocation.Text);
myPlayList.appendItem(mediaItem);
}
var
しかし、これはそもそも使用するポイントの多くを無効にすると思います。