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将被视为. 所以当你调用时,你实际上是在调用它。与许多其他 .NET 类一样 -覆盖该方法。看起来像这样:foreachvarmediaobjectToString()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通过将要迭代的每个项目转换为 a 来成功使用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。