2010-04-28 15 views

Respuesta

5

La prueba de la igualdad no es tan simple.

Considere que 'a' -eq 'A' devuelve verdadero. Eso significa que PowerShell hace algo más que simplemente llamar a Equals.

Además de sus objetos Equals se llama como se esperaba.

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 

Además de que PowerShell utiliza la conversión bastante pesada. Entonces, si los operandos no son del mismo tipo, el operando derecho se convierte al tipo del operando izquierdo. Es por eso que '1' -eq 1 tiene éxito.

3

El operador -eq no es ninguno (como "==" en C#) y Object.Equals(). Ejemplo simple: realiza una comparación de cadenas insensible a mayúsculas y minúsculas. De hecho, realiza muchas conversiones ocultas, y algunas de ellas, desafortunadamente, ni siquiera se esperan intuitivamente.

Aquí está algo interesante demo

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

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