【发布时间】:2016-02-08 16:54:59
【问题描述】:
我目前正在从类型中提取有关方法的信息,这是我当前代码的相关部分(可以正常工作):
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 我不使用 ?> (甚至不确定它是否存在)如果你的意思是替换:?使用 :> 不能以某种模式完成,所以只有我可以使用 :> 的地方才会出现在 for 的“主体”中,而这正是我在初始代码中所做的。如果你不是那个意思,那我就不明白了。
标签: f# type-conversion pattern-matching