2010-07-28 12 views
20

jak konwertować następujący kod VB do C#Jak przekonwertować TryCast w języku C#?

Dim request As HttpWebRequest = TryCast(WebRequest.Create(address), HttpWebRequest) 

próbowałem go stosując jako operatora w C#, ale jej nie działa.

Dziękuję z góry.

+2

Kiedy mówisz, że to nie działa, co masz na myśli? Otrzymujesz błąd? Nie można skompilować? Zwraca wartość null? Czy możesz wyjaśnić? – spinon

Odpowiedz

48

Można używać odlewania za pomocą as; to nie rzuci żadnego wyjątku, ale powrót null jeśli obsada nie jest możliwe (jak TryCast):

HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; 
+3

Możesz uzyskać wartość domyślną, jeśli rzutowanie ma wartość null, używając potrójnego operatora '??' po wyrażeniu 'as'. – stevehipwell

+5

@ Stevo3000: tak, to jest również możliwe (nawet jeśli operatorem, do którego się odwołujesz, jest operator * kojarzący się z nullem) –

+2

To nauczy mnie pisać, zanim się obudzę! – stevehipwell

2

Wystarczy rzucić go:

HttpRequest request = (HttpRequest)WebRequest.Create(address); 

Ten rzuci wyjątek, jeśli obsada nie jest udane.

Operator as zwróci NULL jeśli nie powiedzie się obsada:

HttpRequest request = WebRequest.Create(address) as HttpRequest; 
// if cast failed, request == null 

Tak, to byłoby bliżej TryCast.

+0

Jedyny problem z tym w porównaniu z TryCastem polega na tym, że TryCast zwróci Nothing vs podniesienie wyjątku, jeśli rzutowanie jest nieprawidłowe. AS nie przewiduje wyjątku. – spinon

5

as operator jest w rzeczywistości C# równoważne:

HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; 
Debug.Assert(request != null); // request will be null if the cast fails 

Jednak regularny obsada jest prawdopodobnie preferowane:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(address); 

WebRequest.Create zawsze powinny skutkować HttpWebRequest gdy wywołana z określonego schematu URI. Jeśli nie ma nic przydatnego, gdy gra się nie powiedzie, nie ma potrzeby defensywnego rzucania zmiennej. Jeśli nie zależy Ci na używanym protokole, zmienna request powinna być typu WebRequest (ale stracisz możliwość sprawdzania kodów statusu HTTP).

Aby ukończyć obraz o rzutach i sprawdzaniu typów w języku C#, możesz również przeczytać na stronie is operator.

1

as to zdecydowanie operator, którego szukasz. Jaki błąd dostałeś?

Powiązane problemy