Pregunta

Aunque, tal vez, una bizarra cosa que quiero hacer, necesito crear una Matriz .Net con un límite inferior > 0.Esto al principio parece ser posible, mediante:

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

Produce los resultados deseados (un array de objetos con un límite inferior establecido en 9).Sin embargo la creación de la matriz de instancia no puede ser pasada a otros métodos esperando Object[] me da un error diciendo que:

System.Object[*] no puede ser fundido en un System.Object[].¿Qué es esta diferencia en los tipos de matriz y cómo puedo superar esto?

Editar:el código de prueba =

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

Que produce:"No se puede convertir un objeto de tipo 'System.Objeto[*]' a 'tipo de Sistema.Object[]'."

También me gustaría señalar que este enfoque ¿ de trabajo cuando se usan varias dimensiones:

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

Que funciona bien.

¿Fue útil?

Otros consejos

La razón por la que no pueden lanzar de uno a otro es que este es el mal.

Digamos que usted cree una matriz de objetos[5..9] y se pasa a una función F como un object[].

¿Cómo sería la función sabe que este es un 5..9 ?F está a la espera de una matriz general pero se trata de conseguir un limitado a uno.Se podría decir que es posible saber, pero este es todavía el inesperado y la gente no quiere hacer todo tipo de comprobaciones de límites cada vez que se desee utilizar una matriz simple.

Una matriz es la estructura más simple en la programación, por lo que es demasiado complicado hace unsusable.Usted probablemente necesitará otra estructura.

Lo que podría hacer a hacer es una clase que es una limitada colección que imita el comportamiento que usted desea.De esa manera, todos los usuarios de esa clase sabrá qué esperar.

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();
    }

}

No estoy seguro acerca de por qué eso no puede ser pasado como Objeto[], pero no sería fácil si usted acaba de crear una clase real para envolver una matriz y manejar su "extraña lógica" en la que hay?

Usted recibe los beneficios de la utilización de un verdadero objeto de referencia se podría agregar a la "inteligencia" de su clase.

Editar:¿Cómo estás echando su Matriz, podría publicar algo más de código?Gracias.

Sólo la tienda de su límite inferior en un constante desplazamiento entero, y restar el valor de cualquiera que sea su origen devuelve el índice.

También:este es un viejo VB6 característica.Creo que puede ser un atributo para apoyarla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top