what que net gui framework app .net arrays

.net - que - electron net app



Arrays.Net con lĂ­mite inferior> 0 (4)

La razón por la que no puedes transmitir de uno a otro es que esto es malo.

Digamos que creas una matriz de objetos [5..9] y la pasas a una función F como un objeto [].

¿Cómo sabe la función que este es un 5.9? F espera una matriz general, pero se está restringiendo. Se podría decir que es posible que lo sepa, pero esto todavía es inesperado y la gente no quiere hacer todo tipo de controles de límites cada vez que quiera usar una matriz simple.

Una matriz es la estructura más simple en la programación, por lo que es demasiado complicado lo hace inutilizable. Probablemente necesites otra estructura.

Lo que debes hacer es una clase que es una colección restringida que imita el comportamiento que deseas. De esta forma, todos los usuarios de esa clase sabrán 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(); } }

Aunque quizás sea una buena idea querer hacer, necesito crear una matriz en .Net con un límite inferior> 0. Esto al principio parece posible, usando:

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

Produce los resultados deseados (una matriz de objetos con un límite inferior establecido en 9). Sin embargo, la instancia de matriz creada ya no se puede pasar a otros métodos esperando que Object[] me dé un error que diga que:

System.Object[*] no se puede convertir en un System.Object[] . ¿Cuál es esta diferencia en los tipos de matriz y cómo puedo superar esto?

Editar: código de prueba =

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

Lo cual falla con: "No se puede lanzar el objeto de tipo ''System.Object [*]'' para escribir ''System.Object []''."

También me gustaría señalar que este enfoque SI FUNCIONA cuando se usan dimensiones múltiples:

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

Lo cual funciona bien.


No estoy seguro de por qué no se puede pasar como Objeto [], pero no sería fácil si solo creas una clase real para envolver una matriz y manejar tu "lógica extraña" allí.

Obtendrá los beneficios de usar un objeto de referencia real si pudiera agregar "inteligencia" a su clase.

Editar: ¿Cómo está lanzando su matriz, podría publicar más código? Gracias.


Simplemente almacene su límite inferior en un entero const offset, y reste ese valor de lo que devuelva su fuente como índice.

Además: esta es una característica antigua de VB6. Creo que podría haber un atributo para ayudar a apoyarlo.