IAsyncOperation <irandomaccessstream>未投射</irandomaccessstream>

时间:2014-11-28 18:27:31

标签: c# multithreading async-await covariance iasyncoperation

我有这个类 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>'

有人可以看看我在这里做错了吗。

感谢。

1 个答案:

答案 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