Da https://msdn.microsoft.com/en-us/library/d5x73970.aspxC# operatore di tipo generico uguaglianza
Quando si applica il dove T: vincolo di classe, evitare il == e = operatori sul parametro di tipo perché questi operatori metterà alla prova per identità riferimento soltanto, non! per l'uguaglianza di valore. Questo è il caso anche di se questi operatori sono sovraccaricati in un tipo che viene utilizzato come argomento . Il seguente codice illustra questo punto; l'output è false anche se la classe String sovraccarica l'operatore ==.
public static void OpTest<T>(T s, T t) where T : class
{
System.Console.WriteLine(s == t);
}
static void Main()
{
string s1 = "target";
System.Text.StringBuilder sb = new System.Text.StringBuilder("target");
string s2 = sb.ToString();
OpTest<string>(s1, s2);
}
Tutto ok finché non ho trovato seguendo, con lo stesso metodo
static void Main()
{
string s1 = "target";
string s2 = "target";
OpTest<string>(s1, s2);
}
'uscite 'True', s1 e s2 riferimento diversi oggetti in memoria anche avere lo stesso valore giusto? Mi sto perdendo qualcosa?
Questo è corretto. Può essere visto su [MSDN qui] (https://msdn.microsoft.com/en-us/library/aa691090%28v=vs.71%29.aspx), "Quando due o più valori letterali stringa equivalenti secondo l'operatore di uguaglianza delle stringhe (Sezione 7.9.7) appaiono nello stesso assembly, questi valori letterali delle stringhe si riferiscono alla stessa istanza di stringa. " –