2011-08-18 8 views
19

Zgodnie z dokumentacją urządzenia as operator, as "służy do wykonywania określonych typów konwersji między zgodnymi typami odniesienia". Od Nullable is actually a value type, oczekiwałbym, że as nie będzie z nim pracował. Jednak ten kod kompiluje i uruchamia:Dlaczego operator as może być używany z Nullable <T>?

object o = 7; 
int i = o as int? ?? -1; 
Console.WriteLine(i); // output: 7 

Czy to prawidłowe zachowanie? Czy dokumentacja dla as jest nieprawidłowa? Czy czegoś brakuje?

+3

Nullable to typ wartości, poprawiłem Twój tekst. –

+0

@Matthew: Dzięki. To było dość mylące literówka. – recursive

+1

Wspaniała dyskusja na temat AS/IS i Nullables - http://stackoverflow.com/questions/1583050/performance-surprise- with-as-and-nullable-types – sll

Odpowiedz

21

Czy to prawidłowe zachowanie?

Tak.

Czy dokumentacja jest błędna?

Tak. Poinformowałem menedżera dokumentacji. Dziękuję za zwrócenie mi tej uwagi i przepraszamy za błąd. Oczywiście nikt nie pamiętał aktualizacji tej strony, gdy typy nullable zostały dodane do języka w C# 2.0.

Czy czegoś brakuje?

Można rozważyć odczytanie aktualnej specyfikacji C# zamiast dokumentacji MSDN; jest bardziej ostateczny.

2

czytam:

Należy pamiętać, że jako operator wykonuje tylko konwersje referencyjnych i konwersje bokserskie. Operator as nie może wykonywać innych konwersji, takich jak konwersje zdefiniowane przez użytkownika, które powinny być wykonywane za pomocą wyrażeń Cast.

i konwersje bokserskie .....

+0

Ale to nie jest zwykłe boksowanie, ponieważ było to normalne ' int ", który był zapakowany, a' int? 'jest celem' as'. – recursive

+0

Dlaczego myślisz int? musi być zarządzany w inny sposób niż z tej problemowej perspektywy? – Tigran

+0

Nie wiem, dlaczego jest inaczej. W pewnym sensie jest to związane z tym, o co proszę. – recursive

1

tylko przypuszczenie, ale powiedziałbym, że pola O jako liczbę całkowitą, a następnie konwertuje je do pustych.

+1

Prawie. It * unboxes * obiekt jako liczbę całkowitą, jeśli jest liczbą całkowitą, a następnie konwertuje go do wartości zerowej. Jeśli rozpakowanie nie powiedzie się, wynikiem jest oczywiście pusta wartość n. –

0

Stosujesz "as" do obiektu, który jest typem odniesienia. Może mieć wartość null, w którym to przypadku CLR ma specjalne wsparcie dla rozpakowania odwołania 'null' do typu wartości zerowej. To specjalne rozpakowanie nie jest obsługiwane dla żadnego innego typu wartości, więc, nawet jeśli Nullable jest typem wartości, ma pewne specjalne przywileje.

1

Z dokumentacji o jako słowa kluczowego:

Jest to równoznaczne z następującym wyrażeniem wyjątkiem tego, że wyrażenie jest oceniane tylko jeden raz.

wyrażenie jest typem? (Typ) wyrażenie: (typ) null

Odniesienie do jest zastosowanie również stwierdza, że ​​działa z typów referencyjnych, jednak można również robić rzeczy tak:

int? temp = null; 
if (temp is int?) 
{ 
    // Do something 
} 

jestem zgadywanie, że jest to po prostu niedokładność w dokumentacji referencyjnej, ponieważ typ musi być nullable (tj. typem zerowym lub typem odniesienia) zamiast tylko typem odniesienia.

1

Podobno dokumentacja MSDN na as operator wymaga aktualizacji.

object o = 7; 
int i = o as **int** ?? -1; 
Console.WriteLine(i); 

Jeśli spróbujesz następujący kod gdzie używamy jako operatorowi typu wartość int, pojawi się odpowiedni komunikat o błędzie kompilatora

operatora as musi być używany z typem odniesienia lub pustych typ („int” to rodzaj wartość nie pustych)

jest to aktualizacja choć na the link w sekcji zawartość że cytuje:

The as operator must be used with a reference type or nullable type. 
Powiązane problemy