Mi sono imbattuto in questa situazione e ho pensato che fosse una buona opportunità usare la parola chiave predefinita. Ma non si compila e non riesco a pensare al perché. L'esempio che segue illustra il mio problema:Il confronto di un tipo generico con il suo valore predefinito, senza un vincolo di classe generico, dà un errore di tempo di compilazione
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result != default(TDataSource);
}
}
Otterrete un errore sulla linea 8 (" '==' operatore non può essere applicato a operandi di tipo 'TDataSource' e 'TDataSource'."). Pensavo che l'utilizzo della parola chiave predefinita eliminasse qualsiasi problema di confronto tra tipi di riferimento e tipi di valore.
L'aggiunta di un vincolo generico che limita TDataSource ai tipi di riferimento rende compilata questa parte di codice.
Qualcuno può spiegare perché il compilatore non risolverà questo per me? Non è abbastanza intelligente da vedere questo funzionerebbe?
questo è legato: Can't operator == be applied to generic types in C#?
[Edit] SLaks risposta mi ha dato qualche ispirazione, l'operatore '==' non funziona, ma la funzione Equals dovrebbe.
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result.Equals(default(TDataSource));
}
}
Questa compilazione funziona correttamente?
Se stai solo cercando di capire se c'è stato un risultato, stai sbagliando perché non sarai in grado di dire la differenza tra nessun risultato e il risultato è 0. – Gabe
Gabe la logica del la funzione è solo un esempio, non è utile. – JJoos
La modifica può generare un'eccezione di NullReference. Devi chiamare il metodo statico 'Equals (a, b)'. – SLaks