为什么F#允许不从System.Attribute继承的属性?

Jef*_*yer 8 f#

我使用VS 2019中的模板创建了一个F#'Nunit'项目来进行一些测试,它创建的默认fixture代码如下:

namespace Tests

open NUnit.Framework

[<TestClass>]
type TestClass () =

    [<SetUp>]
    member this.Setup () =
        ()

    [<Test>]
    member this.Test1 () =
        Assert.Pass()
Run Code Online (Sandbox Code Playgroud)

除了对班级宣言的好奇之外,这是一个看起来很普通的班级.我希望看到[<TestFixture>],但我看到[<TestClass>],与自动生成的类型相同.我怀疑这是项目模板中的一个错误,但奇怪的是,F#很乐意编译它,并注意它可能与其他.Net语言不兼容:

warning FS3242: This type does not inherit Attribute, it will not work correctly with other .NET languages.

晶莹剔透.我的问题是,为什么F#甚至允许这样做?.Net中的反射功能是否适用于F#中的这种属性?可能的用例是什么?

小智 6

从历史上看,忘记将检查添加到编译器中.当它被发现时,我建议将其编译错误,但最终会出现向后兼容原因的警告.有关详细信息,请参阅https://github.com/Microsoft/visualfsharp/pull/5192https://github.com/Microsoft/visualfsharp/pull/5610.