2011-09-13 11 views
6

Następująca klasa ma dwie metody, w których M1 narzeka "nie wszystkie ścieżki kodu zwracają wartość", a M2 nie.Ogólne C# pytanie

Pytanie: W jaki sposób kompilator rozwiązuje M2 w kontekście wartości zwracanej? Jak instancja NotImplementedException jest niejawnie rzutować jako int (jeśli istnieje wewnętrzna rozdzielczość czas kompilacji)

class A 
     { 
      int M1() 
      { 
      } 
      int M2() 
      { 
       throw new NotImplementedException(); 
      } 
     } 
+0

Ogólne Seesharp (salutuje) SWeko

+0

Nie mogę znaleźć, gdzie w specyfikacji C# ten proces jest opisany, czy ktoś może to wskazać? – SWeko

+1

@SWeko: Śledziłem to. Tutaj: http://msdn.microsoft.com/en-us/library/aa664437 (VS.71).aspx (ostatni akapit). – Jon

Odpowiedz

7

Sposób nie zawsze jest wymagane, aby powrócić do wartości; w szczególności dozwolone jest również wyjście przez zgłoszenie wyjątku (w takim przypadku nie zwracana jest żadna wartość).

Edit: szczególności the rules for the body of a method która zwraca int są:

  1. Wszystkie dane przedstawione w metodzie return musi powrócić wyrażenie zamienny do int
  2. Koniec bloku metoda nie musi być osiągalny

W twoim przykładzie kompilator może udowodnić, że M2 zawsze wychodzi przez rzucanie , więc koniec bloku metod nie jest osiągalny (spełnia regułę nr 2). Nie ma też żadnych instrukcji, które również spełniają regułę nr 1. Dlatego jest to poprawna definicja metody.

Z drugiej strony M1 nie spełnia zasady nr 2, więc nie jest legalne.

Prawdopodobnie zostałeś wprowadzony w błąd przez komunikat o błędzie, który w ogóle nie wspomina o rzucaniu, ale weź prawie we wszystkich przypadkach metody z wartościami zwracanymi mają wartość return zamiast rzucania - kompilator po prostu mówi, że prawdopodobnie zapomniałeś.

+0

aw, aby pościć dla mojej klawiatury WP7. –

2

wyjątkami wpływa na przepływ kodu. Wszelkie instrukcje po rzutowaniu nie zostaną wykonane, kompilator może to udowodnić, dlatego jest zadowolony ze ścieżki przez tę metodę.

W wyniku wyjątku nie zostanie zwrócony kod int, nic nie zostanie zwrócone w normalnym znaczeniu. Zamiast tego generowany jest wyjątek, CLR obsługuje je inaczej.

http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

0

Wyjątek nie zostanie odrzucony jako int. Kompilator wie, że jest to wyjątek, który zawsze zostanie osiągnięty, więc nie narzeka. Kiedy wyjątek zostanie trafiony, rozwinie stos do bloków obsługi wyjątków lub awarii. Wartość int nigdy nie zostanie zwrócona do wywołującego metody.

0

Jak stwierdzono w MSDN,

Oświadczenie rzut służy do sygnalizowania występowaniu nieprawidłowej sytuacji (wyjątku) podczas wykonywania programu.

Kiedy wykonanie kodu napotkasz rzut oświadczenie, program zostaje zatrzymany, a komunikat Wyjątkiem jest pokazany na użytkownika (jeśli programista nie określił żadnego błędu obsługi logiki)