gpt4 book ai didi

f# - 在事件模式中使用 typeof<_>

转载 作者:行者123 更新时间:2023-12-04 17:56:54 24 4
gpt4 key购买 nike

鉴于以下人为的事件模式:

let (|TypeDef|_|) (typeDef:Type) (value:obj) =
if obj.ReferenceEquals(value, null) then None
else
let typ = value.GetType()
if typ.IsGenericType && typ.GetGenericTypeDefinition() = typeDef then Some(typ.GetGenericArguments())
else None

下列:
let dict = System.Collections.Generic.Dictionary<string,obj>()
match dict with
| TypeDef typedefof<Dictionary<_,_>> typeArgs -> printfn "%A" typeArgs
| _ -> ()

给出错误:

Unexpected type application in pattern matching. Expected '->' or other token.



但这有效:
let typ = typedefof<Dictionary<_,_>>
match dict with
| TypeDef typ typeArgs -> printfn "%A" typeArgs
| _ -> ()

为什么是 typedefof (或 typeof )这里不允许?

最佳答案

即使您使用参数化的事件模式(其中参数是某个表达式),编译器也会将参数解析为模式(而不是表达式),因此语法受到更多限制。

我认为这与这里讨论的问题本质上是相同的:How can I pass complex expression to parametrized active pattern? (我不确定实际的编译器实现,但 F# 规范说它应该解析为模式)。

作为一种解决方法,您可以在引用中写入任何表达式,因此您可以这样做:

let undef<'T> : 'T = Unchecked.defaultof<_>

let (|TypeDef|) (typeExpr:Expr) (value:obj) =
let typeDef = typeExpr.Type.GetGenericTypeDefinition()
// ...

let dict = System.Collections.Generic.Dictionary<string,obj>()
match dict with
| TypeDef <@ undef<Dictionary<_,_>> @> typeArgs -> printfn "%A" typeArgs
| _ -> ()

关于f# - 在事件模式中使用 typeof<_>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6779602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com