0

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

有人可以看看我是否在这里做错了什么。

谢谢。

4

1 回答 1

1

这是不可能的,因为事实IAsyncOperation<T>并非如此covariant

协变使您可以使用比泛型参数指定的类型更多的派生类型。这允许实现变体接口的类的隐式转换和委托类型的隐式转换。

out在泛型类型声明中添加了修饰符来声明协变接口,例如IEnumerable<out T>.

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

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

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

于 2014-11-28T21:40:35.657 回答