Piszę aplikację Xamarin.Forms, używając XAML dla moich widoków, i próbuję napisać IValueConverter
, którego zadanie powinno powrócić false
, jeśli dane wejściowe są "puste" dla typów, w których semantyka ma sens (łańcuchy/listy/sekwencje/tablice/IEnumerables). Zacząłem z poniższych, która zwraca wartość false dla pustych strun, ale nie mogę dowiedzieć się, jak rozszerzyć to na listach, sekwencji, tablic i IEnumerables:Określ, czy lista, sekwencja, tablica lub IEnumerable jest pusta.
type FalseIfEmptyConverter() =
interface IValueConverter with
member __.Convert(value:obj, _, _, _) =
match value with
| :? string as s -> (s <> "" && not (isNull s)) |> box
// TODO: extend to enumerables
| x -> invalidOp <| "unsupported type " + x.GetType().FullName
member __.ConvertBack(_, _, _, _) =
raise <| System.NotImplementedException()
Czego próbowałem że don” t praca:
:? list<_>
nie odpowiada (pudełkowej) wykaz (przynajmniej nie z int) i generuje ostrzeżenieThis construct causes code to be less generic than indicated by its type annotations. The type variable implied by the use of a '#', '_' or other type annotation at or near [...] has been constrained to be type 'obj'
:? list<obj>
nie wywołuje ostrzeżenie, ale również nie pasuje do wersji pudełkowej listę ints- To Jest taka sama z
:? seq<_>
i:? seq<obj>
- To samo z
:? System.Collections.Generic.IEnumerable<obj>
iIEnumerable<_>
(i jeśli umieścić go poniżej podobnymseq
meczu, jak podano powyżej, ostrzega, że reguła nie zostanie dopasowana, co ma sens, ponieważ AFAIKseq
odpowiada doIEnumerable
)
'wartość dopasowania z | :? System.Collections.Wymontowane jako s -> s.GetEnumerator(). MoveNext() |> nie | x -> invalidOp <| "nieobsługiwany typ" + x.GetType(). FullName' –