Использование int?[] вместо object[] в атрибутах

Накидал вспомогательный код для того, чтобы проводить юнит-тестирование реализаций linked list:

[Test]
[TestCase(
    new string[] { "MyLinkedList", "addAtHead", "addAtTail", "addAtIndex", "get", "deleteAtIndex", "get" },
    new object[] { null, 1, 3, new int[] { 1, 2 }, 1, 1, 1 },
    new object[] { null, null, null, null, 2, null, 3 }
)]
public void SinglyListNodeTests(string[] actionsNames, object[] actionsParams, object[] expectedOutput)
{
}

Однако немного некрасиво выглядит тип у expectedOutput: хотел заменить object[] на int?[], но столкнулся с тем, что такой код не хочет компилироваться, выдаёт ошибку

CS0182 An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

Как-то можно обойти это ограничение на атрибуты (возможно в новых версиях языка что-то есть подходящее) или это никак не объехать и только оставить как есть?


Ответы (1 шт):

Автор решения: A K

Итого. В случае int?[] ещё можно выкрутится через object[] и в принципе, я оставил как есть код — атрибуты вполне нормально смотрятся.

А вот когда дошёл до двумерных массивов и jagged — там только через TestCaseSource работаю, как и советовал в комментариях @aepot:

[Test]
[TestCaseSource(nameof(TestCases))]
public void FindDiagonalOrder(int[][] nums, int[] expected)
{
    var actual = new Solution().FindDiagonalOrder(nums);
    Assert.That(actual, Is.EqualTo(expected));
}

private static IEnumerable<object[]> TestCases()
{
    yield return new object[]
    {
        new int[][]
        {
            new int[]{ 1, 2, 3 },
            new int[]{ 4, 5, 6 },
            new int[]{ 7, 8, 9 },
        },
        new int[] {1,2,4,7,5,3,6,8,9 },
    };

    yield return new object[]
    {
        new int[][]
        {
            new int[] { 1,  2,  3,  4 },
            new int[] { 5,  6,  7,  8 },
            new int[] { 9, 10, 11, 12 },
        },
        new int[] { 1 ,2 ,5 ,9 ,6 ,3 ,4 ,7 ,10 ,11 ,8 ,12  },
    };
}

Аналогичный ответ кстати уже когда-то давали в подобных случаях, см. ответ @default locale: Деньги в юнит-тестах: использование decimal в аттрибутах

→ Ссылка