f#中的参数化测试 - 这不是有效的常量表达式

Nik*_*tov 5 f# custom-attributes constant-expression fsunit parameterized-tests

出于某种原因,当通过TestCaseattrubute 将参数传递给测试时,我得到以下关于第一个参数的错误消息,在本例中是一个数组:

这不是有效的常量表达式或自定义属性值

module GameLogicTest = 
    open FsUnit
    open NUnit.Framework
    open GameLogic.Examle

    // This is not a valid constant expression or custom attribute value
    [<TestCase( [| 1; 2; 3 |], 3, 1,1)>]
    let ``let example.`` (a, m, h, c) = 
        a
        |> proof1 m
        |> should equal (h,c)
Run Code Online (Sandbox Code Playgroud)

但是当从属性和方法本身中删除最后一个参数时,一切正常.

[<TestCase( [| 1; 2; 3 |], 3, 1)>]
let ``let example.`` (a, m, h) = 
    a
    |> proof1 m
    |> should equal (h,1)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我最好也定义一个元组int * int但它似乎也不起作用.

ie.*_*ie. 5

CLI对各种属性参数有限制:

  • 原语:bool,int,float等
  • 枚举
  • 字符串
  • type references:System.Type
  • 'kinda objects':盒装(如果需要)来自上面的类型表示
  • 上面一种类型的一维数组(即不允许嵌套数组)

所以我们可以在这一点上得出结论,你不能使用元组作为属性参数的类型.

从这里开始我的猜测,所以下面都不是真的.

我玩了一些不同的属性,发现当属性具有可变数量的参数(params)时,F#编译器开始抱怨每个数组参数.例如,如果我定义以下属性

public class ParamsAttribute : Attribute
{
    public ParamsAttribute(params object[] parameters)
    {}
}
Run Code Online (Sandbox Code Playgroud)

并尝试从F#代码使用它,我会收到一个错误:

[<Params(1, 2, 3)>] // here everything is OK
let x () = ()

[<Params([|1; 2; 3|])>] // the same error as you have
let y () = ()
Run Code Online (Sandbox Code Playgroud)

我想编译器可以将params参数视为一个数组,因此不允许在其中定义"嵌套"数组.但正如我所说,这是一个纯粹的猜测.