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<T>
不是covariant
:
声明协方差使您能够使用比泛型参数指定的派生类型更多的派生类型。这允许对实现变体接口的类进行隐式转换,并对委托类型进行隐式转换。
了一个 covaraint 接口,并在泛型类型声明中添加了 out
修饰符,以便IEnumerable<out T>
.
要解决此问题,您可以将返回的实例显式转换为IRandomAccessStream
:
return Task.Factory.StartNew(() => (IRandomAccessStream)new CustomFileStream()).AsAsyncOperation();
作为旁注 - 使用Task.Factory.StartNew
来模仿异步行为是一种不好的做法。不应通过同步方法调用公开异步包装器