【发布时间】:2023-03-24 03:19:01
【问题描述】:
这行得通
open System
let f = Action(fun () -> Unchecked.defaultof<_>)
但是这个
let f = System.Action(fun () -> Unchecked.defaultof<_>)
产生编译错误
存在多种类型,称为“Action”,采用不同数量的泛型参数。提供类型实例化以消除类型解析的歧义,例如'动作,,_,,,_,,,_>'.
我知道我可以通过添加类型参数占位符 (System.Action<_>(...)) 来修复它,但知道为什么它们的行为不同吗?
编辑
在规范中找到这个,第 14.1.9 节:
当打开模块或命名空间声明组
F时,将项目添加到名称环境中,如下所示:
- 将类型添加到 TypeNames 表中。如果该类型具有 CLI 损坏的通用名称,例如
List'1,则在List和List'1下添加一个条目。
这种行为是否适用于完全限定类型(省略类型参数)?好像不是这样的。
【问题讨论】:
-
关于
new,请注意,当您使用new调用构造函数时,您始终必须提供正确数量的泛型参数(例如,查看使用open System.Collections.Generics; new Dictionary()时会发生什么,而不是只是Dictionary()。这意味着在您的第二次编辑中,您肯定会调用非泛型System.Action构造函数而不是System.Action<unit>构造函数。 -
@kvb:啊,是的——忘记了。我会从问题中删除它,因为它无关紧要。
-
@Daniel 您使用的是 .NET 3.5 还是 .NET 4.0?如果您不使用 4.0,我认为这个 Connect Bug connect.microsoft.com/VisualStudio/feedback/details/482934/… 可能与您的问题有关。
-
@James:这是 .NET 4.0,但问题看起来很相似。
标签: f#