C# 无法在WP 8.1中将void赋值给隐式类型的局部变量
我正在wp8.1中开发一个音乐播放器应用程序&我正在尝试在其中实现跳转列表功能。 为了实现跳转列表,我遵循给定的示例 我正在对可用的代码进行一些必要的更改&这就是我实现所需功能的方式,因为我对C#、MVVM和wp8.1的了解很少 但我在第行的ViewModel中遇到了一个错误C# 无法在WP 8.1中将void赋值给隐式类型的局部变量,c#,mvvm,windows-phone-8.1,jump-list,C#,Mvvm,Windows Phone 8.1,Jump List,我正在wp8.1中开发一个音乐播放器应用程序&我正在尝试在其中实现跳转列表功能。 为了实现跳转列表,我遵循给定的示例 我正在对可用的代码进行一些必要的更改&这就是我实现所需功能的方式,因为我对C#、MVVM和wp8.1的了解很少 但我在第行的ViewModel中遇到了一个错误 var items = ContactModel.CreateSampleData(); 错误是: Cannot assign void to an implicitly-typed local variable 可能
var items = ContactModel.CreateSampleData();
错误是:
Cannot assign void to an implicitly-typed local variable
可能的原因是什么????谁能帮我理解我哪里出错了
using System.Collections;
using Windows.UI.Xaml.Data;
using JumpListSample.Common.JumpList;
using System.Collections.Generic;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Media.Imaging;
using System;
using Windows.Storage;
using Windows.Storage.Search;
using System.Collections.ObjectModel;
namespace JumpListSample.ViewModels
{
public class ContactsViewModel
{
private IList data;
public IList Data
{
get
{
if (data == null)
{
var items = ContactModel.CreateSampleData();
data = items.ToAlphaGroups(x => x.Name);
}
return data;
}
}
private CollectionViewSource collection;
public CollectionViewSource Collection
{
get
{
if (collection == null)
{
collection = new CollectionViewSource();
collection.Source = Data;
collection.IsSourceGrouped = true;
}
return collection;
}
}
}
public class ContactModel
{
// constructor
public ContactModel()
{
Name = "name";
Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png"));
}
public async static void CreateSampleData()
{
ObservableCollection<ContactModel> data = new ObservableCollection<ContactModel>();
try
{
IReadOnlyList<IStorageItem> MusicLibrary = await KnownFolders.MusicLibrary.GetFoldersAsync(CommonFolderQuery.GroupByAlbum);
foreach (IStorageItem item in MusicLibrary)
{
ContactModel obj = new ContactModel();
IStorageItem musicItem = item;
obj.Name = musicItem.Name;
obj.Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png"));
data.Add(obj);
}
}
catch
{
}
finally
{
}
}
public string Name { get; set; }
public ImageSource Albumart { get; set; }
}
}
使用系统集合;
使用Windows.UI.Xaml.Data;
使用JumpListSample.Common.JumpList;
使用System.Collections.Generic;
使用Windows.UI.Xaml.Media;
使用Windows.UI.Xaml.Media.Imaging;
使用制度;
使用Windows.Storage;
使用Windows.Storage.Search;
使用System.Collections.ObjectModel;
命名空间JumpListSample.ViewModels
{
公共类ContactsViewModel
{
私有IList数据;
公共IList数据
{
得到
{
如果(数据==null)
{
var items=ContactModel.CreateSampleData();
data=items.toalphagroup(x=>x.Name);
}
返回数据;
}
}
私有集合ViewSource集合;
公共集合ViewSource集合
{
得到
{
if(集合==null)
{
collection=new CollectionViewSource();
collection.Source=数据;
collection.IsSourceGrouped=true;
}
回收;
}
}
}
公共类模型
{
//建造师
公共联系人模型()
{
Name=“Name”;
Albumart=新位图图像(新Uri(“ms”)-appx:///Assets/Logo.scale-240.png"));
}
公共异步静态void CreateSampleData()
{
ObservableCollection数据=新的ObservableCollection();
尝试
{
IReadOnlyList MusicLibrary=await KnownFolders.MusicLibrary.GetFoldersAsync(CommonFolderQuery.GroupByAlbum);
foreach(音乐库中的IStorageItem)
{
ContactModel obj=新ContactModel();
IStorageItem musicItem=项目;
obj.Name=musicItem.Name;
obj.Albumart=新位图图像(新Uri(“ms”)-appx:///Assets/Logo.scale-240.png"));
添加数据(obj);
}
}
抓住
{
}
最后
{
}
}
公共字符串名称{get;set;}
公共ImageSource相册艺术{get;set;}
}
}
演示代码可以从下载。我同意评论员克林特·古德的建议。您的
CreateSampleData()
方法似乎负责初始化ContactModel
实例的集合。您可能是从Data
属性调用它,因为这些是您想要用来初始化Data
字段的项
也就是说,您有一个严重的问题:C#属性不支持async
/wait
模式。解决这一问题的一种习惯用法是异步初始化备份字段,然后在初始化完成后引发属性更改事件。不幸的是,您的ContactsViewModel
类没有实现INotifyPropertyChanged
或继承DependencyObject
(基于XAML的程序处理属性更改通知的两种方式)
综合所有这些,并对代码进行必要的更改,您将得到如下结果:
联系人查看模型:
public class ContactsViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private IList data;
public IList Data
{
get
{
if (data == null)
{
// Ignore the returned Task...we're not going to do anything with it
var _ = InitData();
}
// Caller should handle null. If not, need to return "new Data[0]" here instead
return data;
}
}
private async Task InitData()
{
// Catch _specific_ exceptions here, if necessary
var items = await ContactModel.CreateSampleData();
data = items.ToAlphaGroups(x => x.Name);
OnPropertyChanged("Data");
}
private CollectionViewSource collection;
public CollectionViewSource Collection
{
get
{
if (collection == null)
{
collection = new CollectionViewSource();
collection.Source = Data;
collection.IsSourceGrouped = true;
}
return collection;
}
}
}
public class ContactModel
{
// constructor
public ContactModel()
{
Name = "name";
Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png"));
}
public async static Task<ObservableCollection<ContactModel>> CreateSampleData()
{
ObservableCollection<ContactModel> data = new ObservableCollection<ContactModel>();
IReadOnlyList<IStorageItem> MusicLibrary = await KnownFolders.MusicLibrary.GetFoldersAsync(CommonFolderQuery.GroupByAlbum);
foreach (IStorageItem item in MusicLibrary)
{
ContactModel obj = new ContactModel();
IStorageItem musicItem = item;
obj.Name = musicItem.Name;
obj.Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png"));
data.Add(obj);
}
return data;
}
public string Name { get; set; }
public ImageSource Albumart { get; set; }
}
联系人型号:
public class ContactsViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private IList data;
public IList Data
{
get
{
if (data == null)
{
// Ignore the returned Task...we're not going to do anything with it
var _ = InitData();
}
// Caller should handle null. If not, need to return "new Data[0]" here instead
return data;
}
}
private async Task InitData()
{
// Catch _specific_ exceptions here, if necessary
var items = await ContactModel.CreateSampleData();
data = items.ToAlphaGroups(x => x.Name);
OnPropertyChanged("Data");
}
private CollectionViewSource collection;
public CollectionViewSource Collection
{
get
{
if (collection == null)
{
collection = new CollectionViewSource();
collection.Source = Data;
collection.IsSourceGrouped = true;
}
return collection;
}
}
}
public class ContactModel
{
// constructor
public ContactModel()
{
Name = "name";
Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png"));
}
public async static Task<ObservableCollection<ContactModel>> CreateSampleData()
{
ObservableCollection<ContactModel> data = new ObservableCollection<ContactModel>();
IReadOnlyList<IStorageItem> MusicLibrary = await KnownFolders.MusicLibrary.GetFoldersAsync(CommonFolderQuery.GroupByAlbum);
foreach (IStorageItem item in MusicLibrary)
{
ContactModel obj = new ContactModel();
IStorageItem musicItem = item;
obj.Name = musicItem.Name;
obj.Albumart = new BitmapImage(new Uri("ms-appx:///Assets/Logo.scale-240.png"));
data.Add(obj);
}
return data;
}
public string Name { get; set; }
public ImageSource Albumart { get; set; }
}
公共类联系人模型
{
//建造师
公共联系人模型()
{
Name=“Name”;
Albumart=新位图图像(新Uri(“ms”)-appx:///Assets/Logo.scale-240.png"));
}
公共异步静态任务CreateSampleData()
{
ObservableCollection数据=新的ObservableCollection();
IReadOnlyList MusicLibrary=await KnownFolders.MusicLibrary.GetFoldersAsync(CommonFolderQuery.GroupByAlbum);
foreach(音乐库中的IStorageItem)
{
ContactModel obj=新ContactModel();
IStorageItem musicItem=项目;
obj.Name=musicItem.Name;
obj.Albumart=新位图图像(新Uri(“ms”)-appx:///Assets/Logo.scale-240.png"));
添加数据(obj);
}
返回数据;
}
公共字符串名称{get;set;}
公共ImageSource相册艺术{get;set;}
}
请注意,我还完全删除了您的try/catch。简单地接受异常是非常糟糕的。如果您认为需要处理任何异常,请在调用者中处理它们(即,
ContactsViewModel.InitData()
),在那里您可以做一些有用的事情,并在必要时通知用户(但只处理特定的异常,即您知道如何响应的异常)。ContactModel.CreateSampleData()不返回任何内容(从技术上讲,它返回void)所以不能将其分配给变量。您可能希望返回“data”公共异步任务CreateSampleData()。顺便说一句,一个空的“finally”语句是没有意义的。我还应该补充一句,您必须“等待”结果。ie.var items=await ContactModel.CreateSampleData();老实说,我并没有深入研究这一切,但“项目”将是一个列表,所以你将返回“数据”。我把整个名单都记下来了