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 подражать асинхронному поведению - плохая практика. Вы не должны выставлять асинхронные оболочки над вызовами методов синхронизации

Другие вопросы по тегам