2009-05-29 8 views
10

Więc mam coś takiegoPowracający typy dopuszczające wartość null smyczkowe

public string? SessionValue(string key) 
{ 
    if (HttpContext.Current.Session[key].ToString() == null || HttpContext.Current.Session[key].ToString() == "") 
     return null; 

    return HttpContext.Current.Session[key].ToString(); 
} 

które nie kompiluje.

Jak mogę zwrócić typ nullable?

Odpowiedz

30

Łańcuch jest już typem zerowym. Nullable może być używany tylko w ValueTypes. String jest typem referencyjnym.

Po prostu pozbyć się "?" i powinieneś być dobry, aby iść!

0

Można przypisać wartość zerową do łańcucha, ponieważ jest to typ odniesienia, nie ma potrzeby, aby można było wprowadzić wartość zerową.

0

Ciąg jest już typu z możliwością zerowania. Nie potrzebujesz "?".

błędów 18 typu „string” musi być typu wartość bez pustych w celu wykorzystywać jako parametr „T” w ogólnym typu lub metodą „System.Nullable”

-1

string jest już nullable na własną rękę.

4

Jak wszyscy inni mówili, string nie potrzebuje ? (co jest skrótem dla Nullable<string>), ponieważ wszystkie typy referencyjne (class es) są już pustych. Dotyczy tylko typu wartości (struct s).

Oprócz tego nie powinieneś dzwonić pod numer ToString(), zanim sprawdzisz, czy jest to null (lub możesz uzyskać NullReferenceException). Ponadto nie powinieneś sprawdzać wyniku ToString() dla null, ponieważ nie powinien on nigdy wrócić null (jeśli poprawnie zaimplementowany). I czy na pewno chcesz zwrócić null, jeśli wartość sesji jest pusta string ("")?

Jest to równoznaczne z tym, co oznaczało napisać:

public string SessionValue(string key) 
{ 
    if (HttpContext.Current.Session[key] == null) 
     return null; 

    string result = HttpContext.Current.Session[key].ToString(); 
    return (result == "") ? null : result; 
} 

Chociaż chciałbym napisać to tak (powrót pusty string jeśli to wartość sesja zawiera):

public string SessionValue(string key) 
{ 
    object value = HttpContext.Current.Session[key]; 
    return (value == null) ? null : value.ToString(); 
} 
+0

„, ponieważ wszystko typy odniesienia (klasy) są już zerowe. " -> Nie wydaje się tak. 'publiczny wektor klasy {public static vector func() {return null; }} 'powoduje błąd. – Assimilater

+0

Interfejsy wydają się być zerowe zawsze – Assimilater

+0

@Assimilater Właśnie wypróbowałem twój kod. Kompilował i działał dla mnie dobrze. 'vector' jest klasą, więc' func() 'może zdecydowanie zwrócić' null'. – Lucas