Вопрос

Хотя, возможно, это странное желание, мне нужно создать массив в .Net с нижней границей > 0.На первый взгляд это кажется возможным, используя:

Array.CreateInstance(typeof(Object), new int[] {2}, new int[] {9});

Дает желаемые результаты (массив объектов с нижней границей, равной 9).Однако созданный экземпляр массива больше не может быть передан другим методам, ожидающим Object[] выдает мне ошибку, говоря, что:

System.Object[*] не может быть отброшено в System.Object[].В чем заключается разница между типами массивов и как ее преодолеть?

Редактировать:тестовый код =

Object x = Array.CreateInstance(typeof(Object), new int[] {2}, new int[] {9});
Object[] y = (Object[])x;

Что не удается:«Невозможно привести объект типа «System.Object[*]» к типу «System.Object[]».»

Еще хотелось бы отметить, что такой подход ДЕЛАЕТ работать при использовании нескольких измерений:

Object x = Array.CreateInstance(typeof(Object), new int[] {2,2}, new int[] {9,9});
Object[,] y = (Object[,])x;

Что работает нормально.

Это было полезно?

Другие советы

Причина, по которой вы не можете выполнить переход от одного к другому, заключается в том, что это зло.

Допустим, вы создаете массив object[5..9] и передаете его функции F как объект[].

Откуда функция узнает, что это 5..9?F ожидает общий массив, но получает ограниченный.Вы могли бы сказать, что он может знать, но это все равно неожиданно, и люди не хотят выполнять всевозможные проверки границ каждый раз, когда хотят использовать простой массив.

Массив — это простейшая структура в программировании, поэтому его слишком усложнение делает его непригодным для использования.Вероятно, вам нужна другая структура.

Вам следует создать класс, который представляет собой ограниченную коллекцию, имитирующую желаемое поведение.Таким образом, все пользователи этого класса будут знать, чего ожидать.

class ConstrainedArray<T> : IEnumerable<T> where T : new()
{
    public ConstrainedArray(int min, int max)
    {
        array = new T[max - min];
    }

    public T this [int index]
    {
        get { return array[index - Min]; }
        set { array[index - Min] = value; }
    }

    public int Min {get; private set;}
    public int Max {get; private set;}

    T[] array;

    public IEnumerator<T> GetEnumerator()
    {
        return array.GetEnumarator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return array.GetEnumarator();
    }

}

Я не уверен, почему это нельзя передать как Object[], но было бы непросто, если бы вы просто создали настоящий класс, чтобы обернуть массив и обрабатывать там свою «странную логику»?

Вы получите преимущества от использования реального ссылочного объекта, если сможете добавить «интеллект» в свой класс.

Редактировать:Как вы используете свой массив, не могли бы вы опубликовать еще код?Спасибо.

Просто сохраните нижнюю границу в целочисленном константном смещении и вычтите это значение из всего, что ваш источник возвращает в качестве индекса.

Также:это старая функция VB6.Я думаю, что может быть атрибут, который поможет поддержать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top