无法将IAsyncOperation <storagefile>类型隐式转换为StorageFile </storagefile>

时间:2013-05-12 21:43:03

标签: c# microsoft-metro async-await filepicker storagefile

我的代码到底出了什么问题?

    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

1 个答案:

答案 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"页面可能是一个不错的起点