我有这个类 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>'
有人可以看看我在这里做错了吗。
感谢。
答案 0 :(得分:1)
由于IAsyncOperation<T>
不是covariant
:
协方差使您可以使用比泛型参数指定的派生类型更多的派生类型。这允许隐式转换实现变体接口的类和委托类型的隐式转换。
声明了covaraint接口,并在泛型类型声明中添加了out
修饰符,因此IEnumerable<out T>
。
要解决您的问题,您可以将返回的实例显式转换回IRandomAccessStream
:
return Task.Factory.StartNew(() => (IRandomAccessStream)new CustomFileStream()).AsAsyncOperation();
作为旁注 - 使用Task.Factory.StartNew
模仿异步行为是不好的做法。 You shouldn't expose async wrappers over sync method calls