2010-04-28 9 views

Odpowiedz

5

Test na równość nie jest takie proste.

Należy pamiętać, że 'a' -eq 'A' zwraca wartość true. Oznacza to, że PowerShell robi coś więcej niż tylko wywołanie Equals.

Dodatkowo dla twoich obiektów Equals jest wywoływane zgodnie z oczekiwaniami.

Add-Type -TypeDefinition @" 
    using System; 
    public class X { 
     public string Property; 
     public X(string s) { 
      Property = s; 
     } 
     public override bool Equals(object o) { 
      System.Console.WriteLine("equals on {0}", Property); 
      return Property == ((X)o).Property; 
     } 
     public override int GetHashCode() { return 20; } 
    } 
"@ 

$o1 = New-Object X 'a' 
$o2 = New-Object X 'A' 

$o1 -eq $o2 

Poza tym PowerShell wykorzystuje konwersję dość mocno. Więc jeśli operandy nie są tego samego typu, prawy operand jest konwertowany na typ lewego argumentu. Dlatego właśnie wygrywa '1' -eq 1.

3

Operator -eq jest żadnym z (jak "==" w C#) i Object.Equals(). Prosty przykład: porównuje łańcuch znaków niewrażliwy na wielkość liter. W rzeczywistości wykonuje wiele konwersji pod okładkami, a niektóre z nich, niestety, mogą nie zawsze być intuicyjnie oczekiwane.

Oto interesujący demo

# this is False 
[ConsoleColor]::Black -eq $true 

# this is True 
$true -eq [ConsoleColor]::Black 
Powiązane problemy