Ho pensato che questo metodo era valido, ma mi sbagliavo:L'operatore '==' non può essere applicato al tipo T?
static void Equals<T>(T x, T y)
{
return x == y; //operator == can't be applied to type T
}
Dopo aver letto la specifiation (§7.2.4 in v3.0 e §7.3.4 in v4.0):
7.2.4 operatore binario risoluzione sovraccarico
un'operazione del modulo x op y, dove op è un operatore binario sovraccaricabile, x è un'espressione di tipo x e Y è un'espressione di tipo Y, viene elaborato come segue:
L'insieme di candidati operatori definiti dall'utente fornite da X e Y per l'operatore op operazione (x, y) è determinata. Il set consiste nell'unione degli operatori candidati forniti da X e gli operatori candidati forniti da Y, ciascuno determinato utilizzando le regole di §7.2.5. Se X e Y sono dello stesso tipo, o se X e Y sono derivati da un tipo base comune, quindi condivisi operatori candidati si verificano solo in combinata di una volta.
Se l'insieme di candidati operatori definiti dall'utente è non vuota, allora questo diventa il set di operatori candidati l'operazione . In caso contrario, le implementazioni op operatorie binarie predefinite, compresi i moduli revocati, diventano l'insieme di operatori candidati per l'operazione . Predefiniti implementazioni di un determinato operatore sono specificate nella descrizione dell'operatore (§7.7 attraverso §7.11).
Le regole di risoluzione di sovraccarico di §7.4.3 vengono applicate all'insieme di operatori candidati per selezionare l'operatore migliore rispetto all'elenco di argomenti (x, y) e questo operatore diventa il risultato del processo di risoluzione del sovraccarico . Se la risoluzione del sovraccarico non riesce a selezionare un singolo miglior operatore, si verifica un errore in fase di compilazione.
Al punto 2 Penso che questa implementazione predefinita dovrebbe essere applicato:
bool operator ==(object x, object y);
bool operator !=(object x, object y);
dato che tutto in C# deriva da Object. Come può verificarsi un errore di compilazione nel passaggio 3? Non penso sia possibile che "la risoluzione di sovraccarico non riesca a selezionare" in questo caso.
EDIT La domanda è venuta in mente quando mi stava realizzando qualcosa di simile:
class EnumComparer<TEnum> : IEqualityComparer<TEnum>
{
public bool Equals(TEnum x, TEnum y)
{
return x == y;
}
public int GetHashCode(TEnum obj)
{
return (int)obj;
}
}
ho paura Ho bisogno di costruire un espressione e invocarlo dynamicly in Equals
metodo.
possibile duplicato del [C# confrontano due valori generici] (http://stackoverflow.com/questions/488250/c-compare-two-generic-values) –
FWIW, '(oggetto) x == (oggetto) y' è valido - ma considera '(oggetto) 1 == (oggetto) 1' come motivo per non desiderarlo. Ho solo bisogno di aiutare 'T' insieme a un non generico. –
La discussione è un po 'astratta, ma Eric Lippert ha sottolineato che è un malinteso generale che tutto * derivi * da "Oggetto". http://blogs.msdn.com/b/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx Un punto rilevante che menziona è che i parametri di tipo non derivano da nulla. –