2009-08-27 12 views
6
if(myVariable is SomeType) 

Z czystej ciekawości, co jest tego przeciwieństwem? Chcę zrobić coś takiego:Czym jest przeciwieństwo "jest"?

if(!myVariable is SomeType) 
if(myVariable is not SomeType) 

Ani skompilować.

Biorąc pod uwagę, że "jest" jest słowem, którego nie można wyszukać w większości wyszukiwarek, znalezienie odpowiedzi na to pytanie było trudne.

Duplikat:

C# : ‘is’ keyword and checking for Not

+0

Zazwyczaj można wyszukać słowo "jest" w wyszukiwarce, jeśli * + "jest" * w zapytaniu, wymagając dopasowania. – Alex

+3

nie jest oczywiście – DLauer

Odpowiedz

28

Spróbuj

if (!(myVariable is SomeType)) 
+0

! powinien znajdować się wewnątrz wspornika. if (! (myVariable is SomeType) – Brandon

+0

To jest poprawna odpowiedź – Maciek

2

nie jestem przed kompilator teraz więc nie można sprawdzić, ale nie chciał

if (!(myVariable is SomeType)) 

praca?

7

Musisz otoczyć instrukcję w nawiasach.

if (!myVariable is SomeType) 

Ta linia stosuje operatora NOT do myVariable, a nie do całego oświadczenia. Spróbuj:

if (!(myVariable is SomeType)) 

Chociaż byłbym ostrożny z kodem, który sprawdza obiekt dla tego typu tak czy owak. Możesz przyjrzeć się koncepcji polimorfizmu.

+1

+1 dla komentarza polimorfizmów Może Deane tego nie potrzebuje, ale z pewnością dobrze jest wspomnieć o tym kodzie takim jak ten –

+0

To jest dość powszechne, aby sprawdzić aby zobaczyć, czy obiekt jest określonego typu, Konstrukcja foreach sprawdza, czy moduł wyliczający implementuje IDisposable. –

+0

Jednak nie powinno to być dość powszechne w twoim kodzie. W języku C# nie ma zbyt wielu zadań, które wymagałyby jawnego sprawdzenia typu, zamiast stosowania polimorfizmu. Nie twierdzę, że nie jest to ważne w niektórych sytuacjach, ale nie powinno być "powszechne". –

4

Jay i marc mają tego najlepszego. Alternatywnie, można zrobić:

var cast = myVariable as SomeType; 
if(cast == null) 
{ 
    // myVariable is not SomeType 
} 

Zaletą tej metody jest to, że teraz mają zmienną już odlany jako SomeType natychmiast gotowy do użycia.

0

Albo jak o przedłużenie rodzajowe? Wolę ten sposób, aby uniknąć tak wielu nawiasów.

Więc trzeba:

if (!MyObject.Is<string>()) 
    //Do blah blah blah 

Zastosowanie:

public static class ObjectExtensions 
{ 
    public static bool Is<T>(this object ToEvaluate) 
    { 
     return ToEvaluate is T; 
    } 
} 

co wydaje się łatwiejsze do odczytania zbyt.