Frage

Obwohl vielleicht ein bizare Sache tun zu wollen, ich muss ein Array erstellen, in .Net mit einer unteren Grenze > 0.Dieses auf den ersten Blick scheint möglich zu sein, mit:

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

Das gewünschte Ergebnis erzeugt (ein array von Objekten mit einer unteren Grenze eingestellt 9).Aber das erstellte array-Instanz kann nicht mehr übergeben werden, um zu anderen Methoden erwartet Object[] gibt mir eine Fehlermeldung, dass:

System.Object[*] kann nicht umgewandelt werden in eine System.Object[].Was ist dieser Unterschied in der array-Typen und wie kann ich das umgehen?

Edit:test code =

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

Das schlägt fehl mit:"Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'."

Ich möchte auch zu beachten, dass dieser Ansatz TUT die Arbeit, wenn Sie mehrere Dimensionen:

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

Das funktioniert gut.

Andere Tipps

Der Grund, warum Sie nicht von einem zum anderen werfen kann, ist, dass dieses Übel ist.

Lassen Sie uns sagen Sie ein Array von Objekt zu erstellen [5..9] und Sie geben es an einer Funktion F als Objekt [].

Wie würde die Funktion weiß, dass dies ein 5..9 ist? F erwartet eine allgemeine Anordnung, aber es ist ein eingeschränktes machtlos. Man könnte sagen, es ist möglich, es zu wissen, aber das ist immer noch unerwartete und die Menschen wollen nicht alle Art von Grenze Kontrollen machen, jedes Mal wenn sie ein einfaches Array verwenden möchten.

Ein Array ist die einfachste Struktur in der Programmierung, so dass es zu kompliziert macht es unsusable. Sie müssen wahrscheinlich eine andere Struktur.

Was Sie chould tun, ist eine Klasse, die eine eingeschränkte Sammlung, die das Verhalten imitiert Sie wollen. Auf diese Weise alle Benutzer dieser Klasse wird wissen, was zu erwarten ist.

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

}

Ich bin mir nicht sicher, warum das nicht als Objekt übergeben werden kann [], aber ich würde nicht einfach sein, wenn Sie nur eine echte Klasse erstellen ein Array wickeln und Ihre „weird Logik“ dort zu behandeln?

Sie werden die Vorteile erhalten von echtem Referenzobjekt verwendet wurden, können Sie „Intelligenz“ zu Ihrer Klasse hinzuzufügen.

Edit: Wie werden Sie Ihre Array Gießen, könnten Sie etwas mehr Code schreiben? Danke.

Speichern Sie einfach Ihre untere Grenze in einer const Offset ganze Zahl und subtrahieren den Wert von was auch immer Ihre Quelle kehrt als Index.

Sie auch: das ist eine alte VB6-Funktion. Ich denke, es könnte ein Attribut sein, es zu helfen, zu unterstützen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top