如何解决从“WinRT.IInspectable”到“System.Collections.Generic.IEnumerable`1[Windows.Storage.IStorageFile]”的无效转换
为什么以下桌面 UWP(或 WinUI 或 WinRT?我对术语感到困惑)代码编译但抛出异常?
var folder = await Windows.Storage.StorageFolder.GetFolderFromPathAsync(@"path\to\folder");
var files = await folder.GetFilesAsync(); //IReadOnlyList<Windows.Storage.StorageFile>)
//Exception: Invalid cast from 'WinRT.IInspectable' to 'System.Collections.Generic.IEnumerable`1[Windows.Storage.IStorageFile]'.
var l1 = ((IReadOnlyList<Windows.Storage.IStorageFile>) files).ToList(); //Even crashes if we add e.g. .Select(_=>42) in-between.
注意从 StorageFile
到 IStorageFile
的转换(一个更讨厌的错误,这是我遇到的,是一种获取后者列表的方法)。在这种情况下转换到接口有什么问题,还是这是一个错误?通常它工作正常,例如((IStorageFile) files[0]).Name
。
这仅在桌面上使用 C#/WinRT 时发生。重现步骤:
- 下载 WinUI 3 Project Templates 扩展程序
- 通过模板创建一个新的 C#“Blank App,Packaged (WinUI in Desktop)”(将创建两个项目,一个用于代码,一个用于包)
- 可能:编辑非包项目文件以确保它为我列出了正确的
TargetFramework
它列出了net5.0-windows10.0.18362.0
而我只安装了 10.0.19041.0。我想我稍后会将此报告为错误。[似乎已经报告:GitHub issue] - 将以下代码添加到例如
OnLauched
中的App.xaml.cs
:
Task.Run(async () =>
{
try
{
var folder = ApplicationData.Current.LocalFolder;
var files = await folder.GetFilesAsync();
_ = ((IReadOnlyList<IStorageFile>) files).ToList();
}
catch (InvalidCastException ex)
{
Debugger.Break();
}
});
- 运行包项目(建议在 CLR 异常上启用中断)
- 观察
InvalidCastException
中的DynamicInterfaceCastableHelpers.IsInterfaceImplemented
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。