2015-03-09 21 views
6

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?

risposta

7

stringhe sono internati in .NET, in modo che quando si fa

string s1 = "target"; 
string s2 = "target"; 

sono entrambi puntano allo stesso oggetto. Questo è il motivo per cui l'esempio MSDN utilizza uno StringBuilder, questo inganna il CLR nella creazione di un altro oggetto stringa con lo stesso valore in modo che l'operatore test nel metodo generico restituisca false.

+1

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. " –