C#错误:上下文关键字'var'可能只出现在局部变量声明

时间:2016-01-15 09:48:01

标签: c# winforms compiler-errors var

我编写了以下函数来创建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上显示以下错误:

  

字段初始值设定项不能引用非静态字段,方法或属性

这些信息是否与我所看到的错误有关?如何解决这个问题?

4 个答案:

答案 0 :(得分:10)

您必须使用正确的类型声明它,而不是使用var

AxWMPLib.IWMPPlaylist p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");

var仅允许在局部变量上,而不是在字段上,这就是错误消息告诉您的内容。错误消息并不意味着该字段在错误的位置声明,您只是使用了错误的字段类型语法。

答案 1 :(得分:1)

MSDN说:

  

更正此错误

     

如果变量属于类范围,请为其指定显式类型。   否则将其移动到将要使用它的方法中。

因此,您可以在声明变量类型(例如

)时提供正确的类型
IWMPPlaylist p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");

或者您可以在要使用它的方法内移动变量。在您的情况下,您可以在 CreatePlaylist 方法中移动它。

答案 2 :(得分:1)

构造函数中初始化播放列表并将播放列表作为参数传递,这样就可以解决@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();
}
}
}

答案 3 :(得分:0)

其他人已经提到了这个问题。您需要的具体类型是IWMPPlaylist,因此整行将如下所示。

IWMPPlaylist p2 = axWindowsMediaPlayer.playlistCollection.newPlaylist("Playlist 1");