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 类一样 -覆盖该方法。看起来像这样:foreach
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
通过将要迭代的每个项目转换为 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
。