Domanda

Ricevo un errore quando compilo questo codice:

using System;

public struct Vector2
{
    public event EventHandler trigger;

    public float X;
    public float Y;

    public Vector2 func()
    {
        Vector2 vector;
        vector.X = 1;
        vector.Y = 2;
        return vector;  // error CS0165: Use of unassigned local variable 'vector'
    }
}

ciao!

Il compilatore dice: " Uso della variabile locale non assegnata 'vector' " e indica il valore restituito. Mi sembra che Vector2 diventi un tipo di riferimento (senza il membro dell'evento che agisce normalmente). Che cosa sta succedendo?

È stato utile?

Soluzione

In C # devi ancora "nuovo" una struttura per chiamare un costruttore a meno che tu non stia inizializzando tutti i campi. Hai lasciato 'trigger' il membro EventHandler non assegnato.

Prova ad assegnare a "trigger" o usando:

Vector2 vector = new Vector2()

Il nuovo oggetto non è non allocato nell'heap, ma è ancora allocato nello stack di funzioni.

Per citare MSDN :

  

Quando si crea un oggetto struct usando   il nuovo operatore, viene creato e   viene chiamato il costruttore appropriato.   A differenza delle classi, le strutture possono essere   istanziato senza usare il nuovo   operatore. Se non si utilizza nuovo, il   i campi rimarranno non assegnati e il    l'oggetto non può essere utilizzato fino a quando non tutti   i campi sono inizializzati.

Altri suggerimenti

Altri hanno spiegato i modi per aggirare questo problema, ma penso che valga la pena menzionare l'altro grande, grosso problema con il tuo codice: hai una struttura mutabile. Quelli sono praticamente sempre una cattiva idea. Questo è destinato a essere solo il primo di molti problemi che incontrerai se lo tieni in questo modo.

Consiglio fortemente di renderlo immutabile o renderlo una classe.

Rob Walker ha una risposta migliore, dal momento che è partito dai documenti e poi ha ragionato sul codice (mentre io ho fatto il contrario).

Se compili il codice di esempio con il campo trigger commentato e quindi esegui IlAsm per ottenere la MSIL risultante, noterai che non esiste un opcode initobj per il vettore variabile locale.

La mancanza di initobj va bene quando la struttura Vector2 contiene solo tipi di valore. Dopotutto sono solo memoria grezza. Tuttavia, se la struttura Vector2 contiene anche un riferimento, deve essere inizializzata per evitare di avere un riferimento a un oggetto non inizializzato.

Per evitare di restituire un oggetto parzialmente unitizzato, è necessario scrivere esplicitamente sul gestore eventi trigger o inizializzare l'intero oggetto mediante una nuova operazione. Tuttavia, in nessun caso la struttura viene trasformata in un tipo di riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top