代码之家  ›  专栏  ›  技术社区  ›  Yash Saraiya

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

  •  0
  • Yash Saraiya  · 技术社区  · 9 年前

    我编写了以下函数来创建 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 回复  |  直到 9 年前
        1
  •  10
  •   Lasse V. Karlsen    9 年前

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

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

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

        2
  •  1
  •   Rahul Tripathi    9 年前

    这个 MSDN 说:

    要更正此错误

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

    因此,您可以在声明变量类型时给出正确的类型,如

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

    或者,您可以将变量移动到要使用的方法中。在您的情况下,您可以在 创建播放列表 方法

        3
  •  1
  •   Yash Saraiya    9 年前

    正在初始化中的播放列表 施工单位 并将播放列表作为参数传递,就像@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();
    }
    }
    }
    
        4
  •  0
  •   Herbstein    9 年前

    其他人已经提到了这个问题。您想要的特定类型是 IWMPPlaylist ,所以全线看起来像这样。

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