As folks have eluded, you need to compare apples to apples, or in this instance string to string or object to object. Compare-Object will compare objects and identify if the object contains the same values. If everything matches, it would return null, which could give you a boolean comparison:
Compare string: True
Compare string by index: True
Compare by like: True
Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the size of the argument list..
At line:11 char:1
+ "Compare string: {0}" -f ($x -eq $y)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Compare string: {0}:String) [], RuntimeException
+ FullyQualifiedErrorId : FormatError
Compare string by index: False
Error formatting a string: Index (zero based) must be greater than or equal to zero and less than the size of the argument list..
At line:13 char:1
+ "Compare by like: {0}" -f ($x -like $y)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Compare by like: {0}:String) [], RuntimeException
+ FullyQualifiedErrorId : FormatError
Value is in array: True
Compare-Object: True
For -contains, it is quite simply because they are not the same object. Since you are running gsv two different times, it is generating two distinctly different objects that happen to have all of the same data. If you use -contains and the exact same object is actually in the variable, it does return true as expected.