不能隐式转换IAsyncOperationStorageFile

本文关键字:StorageFile IAsyncOperation 转换 不能 | 更新日期: 2023-09-27 18:13:09

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

    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' to 'Windows.Storage.StorageFile'

如果我添加'await',就像在代码上注释一样,我得到以下错误:

¹'await'操作符只能在async方法中使用。考虑使用'async'修饰符标记此方法,并将其返回类型更改为'Task'。

源代码在这里

不能隐式转换IAsyncOperation<StorageFile>StorageFile

好吧,你的代码不能编译的原因是由编译器错误消息直接解释的。FileOpenPicker.PickSingleFileAsync返回一个IAsyncOperation<StorageFile>,所以不,你不能把返回值赋给一个StorageFile变量。在c#中使用IAsyncOperation<>的典型方法是使用await

你只能在async方法中使用await…所以你可能想把你的方法改成异步的:

private async void BrowseButton_Click(object sender, RoutedEventArgs e)
{
    ...
    StorageFile file = await FilePicker.PickSingleFileAsync();
    ...
}

请注意,对于事件处理程序以外的任何事情,最好让异步方法返回Task而不是void -使用void的能力实际上只是为了可以使用异步方法作为事件处理程序。

如果你还不太熟悉async/await,你应该在进一步学习之前先阅读一下——MSDN的"异步编程与async和await"页面可能是一个不错的起点。