ListViewItemCollectionジェネリックICollection<T>またはIEnumerable<T>インターフェイスを実装していないため、コンパイラはItemsコレクションを見て型を推測できません。したがって、使用する代わりにforeach型のコレクションを反復処理していることをループに明示的に伝える必要があるのはなぜですか。ListViewItemvar
したがって、次のコードが機能します。
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 クラスと同様に、メソッドをオーバーライドします。次のようになります。varmediaobjectToString()ListViewItemListViewItemSystem.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しかし、これはそもそも使用するポイントの多くを無効にすると思います。