IAsyncOperation<IRandomAccessStream> не приводится
У меня есть этот класс 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 ответ
Это невозможно из-за того, что IAsyncOperation<T>
не covariant
:
Ковариантность позволяет вам использовать более производный тип, чем тот, который задан универсальным параметром. Это позволяет неявное преобразование классов, которые реализуют интерфейсные варианты, и неявное преобразование типов делегатов.
Ковариантный интерфейс объявляется с out
модификатор, добавленный к нему в объявлении универсального типа, так что IEnumerable<out T>
,
Чтобы обойти вашу проблему, вы можете явно привести возвращенный экземпляр к IRandomAccessStream
:
return Task.Factory.StartNew(() => (IRandomAccessStream)new CustomFileStream()).AsAsyncOperation();
Как примечание стороны - используя Task.Factory.StartNew
подражать асинхронному поведению - плохая практика. Вы не должны выставлять асинхронные оболочки над вызовами методов синхронизации