C# 错误:上下文关键字“var”可能只出现在局部变量声明中
本文关键字:局部变量 声明 上下文 错误 关键字 var | 更新日期: 2023-09-27 18:30:34
我编写了以下函数来创建axWindowsMediaPlayer
播放列表:
WMPLib.IWMPPlaylist p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");
private void CreatePlaylist(string _currentId)
{
string selectedElementPageTypeValue = MainContentAreaBl.GetSelectedElementPageTypeValue(_currentId);
var selectedElementJumpToValue = MainContentAreaBl.GetSelectedElementValue(_currentId, "jumpTo");
if (selectedElementJumpToValue != null)
{
_currentId = selectedElementJumpToValue;
if (_currentId != null && _currentId != "menu" && selectedElementPageTypeValue == "video")
{
var playerFile = Path.Combine(Common.ContentFolderPath, MainContentAreaBl.GetSelectedElementDataPathValue(_currentId));
p2.appendItem(axWindowsMediaPlayer.newMedia(playerFile));
axWindowsMediaPlayer.currentPlaylist = p2;
CreatePlaylist(_currentId);
}
axWindowsMediaPlayer.Ctlcontrols.play();
}
}
这里var p2
是在类级别声明的。编译应用程序时,收到以下错误消息:
上下文关键字"var"只能出现在局部变量声明中
但是,我不能将var p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");
放在递归函数中,因为它会在每次迭代时创建新的播放列表。
如何在函数中访问 p2?
编辑1:我在输出窗口中看到这个
COM 引用"WMPLib"是 ActiveX 控件"AxWMPLib"的互操作程序集,但被标记为由编译器使用/link 标志链接。此 COM 引用将被视为引用,不会链接。
另外,现在它在axWindowsMediaplayer
上显示以下错误:
字段初始值设定项不能引用非静态字段、方法或属性
此信息是否与我看到的错误有任何关系?如何解决这个问题?
您必须使用正确的类型声明它,而不是使用 var
:
AxWMPLib.IWMPPlaylist p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");
只允许对局部变量var
,不允许对字段使用,这就是错误消息告诉您的。错误消息并不意味着字段声明在错误的位置,您只是对字段类型使用了错误的语法。
MSDN 说:
更正此错误
如果变量属于类范围,请为其指定显式类型。 否则,将其移动到将使用它的方法中。
因此,您可以在声明变量类型时给出正确的类型,例如
IWMPPlaylist p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");
或者,您可以将变量移动到将要使用的方法中。在您的情况下,您可以将其移动到 CreatePlaylist 方法中。
在构造函数中初始化播放列表并将播放列表作为参数传递,就像@thumbnumkeys回答的那样(现已删除)。这是对我有用的代码:
namespace ABC
{
public partial class MainContentArea : Form
{
private string _currentId;
public MainContentArea(string topicId, Menu menu)
{
InitializeComponent();
_currentId = topicId;
_menu = menu;
WMPLib.IWMPPlaylist p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");
CreatePlaylist(_currentId, p2);
}
private void CreatePlaylist(string _currentId, WMPLib.IWMPPlaylist p2)
{
var selectedElementJumpToValue = MainContentAreaBl.GetSelectedElementValue(_currentId, "jumpTo");
string selectedElementPageTypeValue = MainContentAreaBl.GetSelectedElementPageTypeValue(selectedElementJumpToValue);
if (selectedElementJumpToValue != null)
{
_currentId = selectedElementJumpToValue;
if (_currentId != null && _currentId != "menu" && selectedElementPageTypeValue == "video")
{
var playerFile = Path.Combine(Common.ContentFolderPath, MainContentAreaBl.GetSelectedElementDataPathValue(_currentId));
p2.appendItem(axWindowsMediaPlayer.newMedia(playerFile));
axWindowsMediaPlayer.currentPlaylist = p2;
CreatePlaylist(_currentId, p2);
}
//axWindowsMediaPlayer.BringToFront();
}
axWindowsMediaPlayer.Ctlcontrols.play();
}
}
}
其他人已经提到了这个问题。您想要的特定类型是 IWMPPlaylist
,因此整行将如下所示。
IWMPPlaylist p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");