IAsyncOperation不强制转换

本文关键字:转换 IRandomAccessStream IAsyncOperation | 更新日期: 2023-09-27 18:32:32

我有这个类CustomFileStream,下面是它的签名

public class CustomFileStream : IRandomAccessStream {}

但是当我这样使用它时,

IAsyncOperation<IRandomAccessStream> IStorageFile.OpenAsync(FileAccessMode accessMode)
{
    return Task.Factory.StartNew(() => new CustomFileStream()).AsAsyncOperation();
}

我收到编译错误,

Cannot implicitly convert type 'Windows.Foundation.IAsyncOperation<CustomFileStream>' 
to 
'Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IRandomAccessStream>'

有人可以看看我在这里做错了什么吗?

谢谢。

IAsyncOperation<IRandomAccessStream>不强制转换

这是不可能的,因为

IAsyncOperation<T>不是covariant

协方差使您能够使用比泛型参数指定的派生类型更多的派生类型。这允许对实现变体接口的类进行隐式转换,并对委托类型进行隐式转换。

声明

了一个 covaraint 接口,并在泛型类型声明中添加了 out 修饰符,以便IEnumerable<out T> .

要解决此问题,您可以将返回的实例显式转换为IRandomAccessStream

return Task.Factory.StartNew(() => (IRandomAccessStream)new CustomFileStream()).AsAsyncOperation();

作为旁注 - 使用Task.Factory.StartNew来模仿异步行为是一种不好的做法。不应通过同步方法调用公开异步包装器