stworzyłem rur stanie ofType<'T>
funkcję sekwencji opartej na Enumerable.OfType<'T>()
:błąd Rodzaj związane z rodzajowych w zależności od lokalizacji funkcji
let ofType<'T> (sequence : _ seq) = sequence.OfType<'T>()
Używając tego w tym samym .fsx
pliku działa dobrze; to nadal robi kiedy mogę umieścić go w module:
module Seq =
let ofType<'T> (sequence : _ seq) = sequence.OfType<'T>()
przestaje działać kiedy przenieść go do innego pliku skryptu i (być w stanie uzyskać do niego dostęp z zewnątrz) zawinąć go w innym module najwyższego poziomu:
module Prelude =
open System.Linq
module Seq =
let ofType<'T> (sequence : _ seq) = sequence.OfType<'T>()
odwołać to z mojego oryginalnego pliku skryptu, otwórz moduł Prelude
i wywołać funkcję tak:
let getXmlIncludes (xtype : Type) =
xtype.GetCustomAttributes() |> Seq.ofType<XmlIncludeAttribute>
który powoduje Seq.ofType<XmlIncludeAttribute>
być marke d jako błąd z komunikatem
error FS0001: Type mismatch. Expecting a
Collections.Generic.IEnumerable<Attribute> -> 'a
> but given a
Collections.Generic.IEnumerable<Attribute> -> Collections.Generic.IEnumerable<XmlIncludeAttribute>
The type 'obj' does not match the type 'Attribute'
Błąd pozostaje taka sama kiedy przenieść ofType<'T>
bezpośrednio do modułu Prelude
.
Dlaczego tak się dzieje i jak mogę to uniemożliwić?
(próbowałem zmianę rodzaju _ seq
parametru do 'TSeq seq
sequence
, co skutkuje niezwykle popularnej
warning FS0064: This construct causes code to be less generic than indicated by the type annotations. The type variable 'TSeq has been constrained to be type 'obj'.
ale wie nic o błędzie nie zmieni).
I nie wydają się odtworzyć swój błąd. Może mógłbyś zapewnić repozytorium demonstrujące błąd. – Ringil
Czy istniejący 'Seq.cast' już nie jest w nazwie" Enumerable.OfType "? – Sehnsucht
@Sehnsucht 'TypTylko' jest takie samo jak '.Where (x => x to typeof (T))', np. filtr według typu. Śledź mój pierwszy link z odpowiedzi, a zobaczysz zarówno implementacje "OfType" i "Cast" na tym samym ekranie. –