C # Есть ли способ объявить ненулевой нижний предел массива typeof (динамический) - PullRequest
0 голосов
/ 29 апреля 2018

Мне это нужно для интерфейса библиотеки vb6, которая ожидает, что эта форма выходного массива выполнит некоторые вычисления над данными. Есть ли какая-либо форма обходного пути, так как я не могу использовать оператор typeof(dynamic) только в объявлении массива typeof(object) ...

Что я пробовал до сих пор:

System.Array Outputs = Array.CreateInstance(typeof(Object), 1);
System.Array Outputs = Array.CreateInstance(typeof(object), 1);
System.Array Outputs = Array.CreateInstance(typeof(dynamic), 1); // Compilation error

1 Ответ

0 голосов
/ 29 апреля 2018

dynamic действительно существует только во время компиляции. Например, если вы создаете List<dynamic>, это действительно создает List<object>. Таким образом, нет смысла использовать typeof(dynamic), поэтому третья строка не компилируется. Если вы передаете массив другому коду, то этот другой код использует этот массив - во время выполнения нет ничего, что могло бы существовать, чтобы «знать», что он предназначен для динамической типизации.

Но чтобы создать массив, вы должны предоставить length . Используемая вами перегрузка Array.CreateInstance всегда использует нижнюю границу нуля. Вы хотите, чтобы перегрузка принимала два массива целых чисел - один для длин и один для нижних границ. Например:

using System;

class Program
{
    static void Main()
    {
        Array outputs = Array.CreateInstance(
            typeof(object), // Element type
            new[] { 5 },    // Lengths                                             
            new[] { 1 });   // Lower bounds

        for (int i = 1; i <= 5; i++)
        {
            outputs.SetValue($"Value {i}", i);
        }
        Console.WriteLine("Set indexes 1-5 successfully");
        // This will throw an exception
        outputs.SetValue("Bang", 0);        
    }
}
...