我目前正在提取有關從這裏型方法的信息是我當前的代碼的相關部分(其中正常工作):爲什麼這個「對於類型測試模式」失敗?
let ctorFlags = BindingFlags.NonPublic ||| BindingFlags.Public ||| BindingFlags.Instance ||| BindingFlags.Static
let methodFlags = BindingFlags.DeclaredOnly ||| ctorFlags
[
for t in Assembly.GetExecutingAssembly().GetTypes() do
for c in t.GetConstructors ctorFlags -> c :> MethodBase
for m in t.GetMethods methodFlags -> m :> MethodBase
]
|> printfn "%A"
然後我想使使用的事實syntax是for pattern in expr
一個小的變化。並且,如果給定的輸入匹配到type test pattern匹配(或派生類型的)給定類型;所以我寫了這個:
// same flags as before
[
for t in Assembly.GetExecutingAssembly().GetTypes() do
for :? MethodBase as m in t.GetConstructors ctorFlags -> m
for :? MethodBase as m in t.GetMethods methodFlags -> m
]
|> printfn "%A"
這給了我一個錯誤的GetConstructors
線(由我翻譯成英文)
不兼容的類型約束。類型
MethodBase
與類型ConstructorInfo
不兼容。
經過仔細檢查ConstructorInfo源自MethodBase(並且與MethodInfo相同)。
注意:如果使用柔性類型(#MethodBase
)代替;該模式的工作原理,但對構造m
的類型爲RuntimeConstructorInfo
和方法m
散列類型RuntimeMethodInfo
(什麼是使用靈活型預期的行爲)。我明顯地測試了它們,因爲有兩種不同類型的列表是不允許的。
所以問題是:爲什麼我錯過了/誤解?
如果你使用:中>代替>,這是否解決您的問題? – Foole
@Fole我不使用?>(甚至不知道它存在),以防萬一你的意思是替換:?與:>不能在一個模式中完成,所以只有我可以使用的地方:>將在for的「body」中,這正是我在最初的代碼中完成的。如果你不是那個意思,那我就不明白了。 – Sehnsucht