【问题标题】:C# Error: The contextual keyword 'var' may only appear within a local variable declarationC# 错误:上下文关键字“var”只能出现在局部变量声明中
【发布时间】:2016-01-15 09:48:00
【问题描述】:

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

字段初始化器不能引用非静态字段、方法或属性

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

【问题讨论】:

    标签: c# winforms compiler-errors var


    【解决方案1】:

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

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

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

    【讨论】:

    • 我的应用程序也不接受 IWMPPlaylist
    • 应该是因为这是newPlaylist 返回的接口类型,但这取决于您使用的是dynamic 还是类似的。你能告诉我们当你使用那个接口类型时它说什么吗?
    • 试试WMPLib.IWMPPlaylist
    • 在使用WMPLib.IWMPPlaylist 时,我收到以下错误:“字段初始化程序无法引用非静态字段、方法或属性”
    • 那么对不起,我帮不了你,你需要自己找出这个newPlaylist方法返回的类型。你仍然不能使用var,你必须指定一个实际的类型。
    【解决方案2】:

    MSDN 说:

    更正此错误

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

    所以你可以在声明变量的类型时给出正确的类型,比如

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

    否则,您可以将变量移动到将要使用的方法内。在您的情况下,您可以将其移动到 CreatePlaylist 方法中。

    【讨论】:

    • 我不能在 CreatePlaylist 方法中移动它,因为它是一个递归方法。如果我这样做,那么它将每次都创建新的播放列表,而不是 追加当前列表跨度>
    • 在使用 IWMPPlaylist 时,我收到以下错误:“找不到类型或命名空间名称 'IWMPPlaylist'(您是否缺少 using 指令或程序集引用?)"
    【解决方案3】:

    Constructor 中初始化播放列表并将播放列表作为参数传递,正如@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】:

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

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

      【讨论】:

      • 在使用 IWMPPlaylist 时,我收到以下错误:“找不到类型或命名空间名称 'IWMPPlaylist'(您是否缺少 using 指令或程序集引用?)"
      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      相关资源
      最近更新 更多