我的代码到底出了什么问题?
private void BrowseButton_Click(object sender, RoutedEventArgs e)
{
FileOpenPicker FilePicker = new FileOpenPicker();
FilePicker.FileTypeFilter.Add(".exe");
FilePicker.ViewMode = PickerViewMode.List;
FilePicker.SuggestedStartLocation = PickerLocationId.Desktop;
// IF I PUT AWAIT HERE V I GET ANOTHER ERROR¹
StorageFile file = FilePicker.PickSingleFileAsync();
if (file != null)
{
AppPath.Text = file.Name;
}
else
{
AppPath.Text = "";
}
}
它给了我这个错误:
无法将类型'Windows.Foundation.IAsyncOperation'隐式转换为'Windows.Storage.StorageFile'
如果我添加'await',就像在代码上发表评论一样,我会收到以下错误:
¹'await'运算符只能在异步方法中使用。考虑使用'async'修饰符标记此方法并将其返回类型更改为'Task'。
代码来源here
答案 0 :(得分:5)
嗯,编译错误消息直接解释了代码无法编译的原因。 FileOpenPicker.PickSingleFileAsync
会返回IAsyncOperation<StorageFile>
- 所以不会,您无法将该返回值分配给StorageFile
变量。在C#中使用IAsyncOperation<>
的典型方法是使用await
。
您只能在await
方法中使用async
...所以您可能希望将方法更改为异步:
private async void BrowseButton_Click(object sender, RoutedEventArgs e)
{
...
StorageFile file = await FilePicker.PickSingleFileAsync();
...
}
请注意,对于除事件处理程序之外的任何内容,最好使异步方法返回Task
而不是void
- 使用void
的能力实际上只是为了可以使用异步方法作为事件处理程序。
如果你还不熟悉async
/ await
,你可能应该在进一步阅读之前阅读它 - MSDN "Asynchronous Programming with async and await"页面可能是一个不错的起点