Решение Брайана мне подходит, но вам действительно нужна ковариация массива?
Если у вас есть функция, которая принимает ISomething[]
и хотите передать ее SomeSomething[]
, тогда вам это нужно, но если функция читает только значения типа ISomething
из массива (что позволяет ковариация), тогда вы можете использовать хеш-тип и написать функцию, которая принимает #ISomething[]
. (Конечно, если вы можете изменить функцию!)
Таким образом, функция может работать с массивом любых элементов, которые реализуют ISomething
, и вам не нужна ковариация массива при ее вызове. Вот пример:
type A() =
interface IDisposable with
member x.Dispose() = printfn "gone"
// Disposes the first element from an array
let disposeFirst (a:#IDisposable[]) = a.[0].Dispose()
// Call 'disposeFirst' with 'A[]' as an argument
let aa = [| new A(); new A() |]
disposeFirst aa
Мне кажется, что главная причина ковариации массивов в .NET заключается в том, что она была необходима в то время, когда непатентованные средства не существовали, но, похоже, F # вполне может без этой функции жить.