Hvorfor får jeg denne feil skape og returnere en ny struct?

stemmer
3

Jeg får en feilmelding når jeg kompilere denne koden:

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'
    }
}

hei!

Kompilatoren sier: Bruk av tilordnet lokal variabel 'vector' og peker på returverdien. Det ser for meg at Vektor2 bli en referansetype (uten hendelsen medlem den fungerer normalt). Hva skjer?

Publisert på 18/11/2008 klokken 00:33
kilden bruker
På andre språk...                            


3 svar

stemmer
14

I C # må du fortsatt 'nye' en struct å kalle en konstruktør med mindre du er initialisering alle feltene. Du forlot Event medlem 'trigger' tilordnet.

Prøv heller å tilordne til 'trigger' eller ved hjelp av:

Vector2 vector = new Vector2()

Den nye gjenstand er ikke fordeles på haugen, er det fortsatt tildelt på funksjoner stabelen.

For å sitere MSDN :

Når du oppretter en struct objekt med den nye operatøren, det blir skapt og riktig konstruktør kalles. I motsetning til klasser, kan structs instansieres uten å bruke den nye operatøren. Hvis du ikke bruker nye, vil feltene være tilordnet og det objektet kan ikke brukes før alle felt er klargjort.

Svarte 18/11/2008 kl. 00:38
kilden bruker

stemmer
2

Andre har forklart måter rundt dette, men jeg tror det er verdt å nevne den andre store, store problemer med koden din: du har en foranderlig struct. De er stort sett alltid en dårlig idé. Dette er nødt til å være bare den første av mange problemer du vil støte på hvis du holder det på den måten.

Jeg sterkt anbefale at du enten gjøre det uforanderlige eller gjøre det en klasse.

Svarte 18/11/2008 kl. 06:32
kilden bruker

stemmer
1

Rob Walker har et bedre svar, siden han startet fra docs og deretter begrunnet i koden (mens jeg gikk den andre veien rundt).

Hvis du kompilere eksempelkoden med avtrekkeren feltet kommentert ut, og deretter kjøre IlAsm å få den resulterende MSIL, vil du se at det ikke er initobjopcode for lokal variabel vektoren.

Mangelen på initobjer greit når den Vector2onen kun inneholder verdityper. De er bare rå minne tross alt. Men hvis Vector2konstruksjonen inneholder også en referanse, det må startes opp for å hindre at en gjenstand som ikke er initialisert referanse.

For å unngå retur en delvis unitialized objekt, må du skrive til triggerhendelseshåndterer eksplisitt, eller initial hele objektet ved hjelp av en ny operasjon. Imidlertid ikke i noe tilfelle er strukturen blitt til et referansetypen.

Svarte 18/11/2008 kl. 00:53
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more