Je viens de rencontrer cette situation et j'ai pensé que c'était une bonne opportunité d'utiliser le mot clé par défaut. Mais il ne compile pas et je ne peux pas penser à pourquoi. L'exemple ci-dessous illustre mon problème:La comparaison d'un type générique avec sa valeur par défaut, sans contrainte de classe générique, donne une erreur de compilation
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result != default(TDataSource);
}
}
Vous obtiendrez une erreur sur la ligne 8 (« opérateur « == » ne peut pas être appliqué aux opérandes de type « TDataSource » et « TDataSource ». »). Je pensais que l'utilisation du mot-clé par défaut éliminerait tout problème de comparaison entre les types de référence et les types de valeur. L'ajout d'une contrainte générique limitant TDataSource aux types de référence permet de compiler ce morceau de code. Est-ce que quelqu'un peut expliquer pourquoi le compilateur ne résoudra pas cela pour moi? Est-ce que ce n'est pas assez intelligent pour voir ça fonctionnerait?
Ceci est lié: Can't operator == be applied to generic types in C#?
[Modifier] de réponse m'a donné un peu d'inspiration, l'opérateur '==' ne fonctionnera pas, mais la fonction Equals devrait le faire.
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result.Equals(default(TDataSource));
}
}
Cette compilation devrait-elle fonctionner correctement?
Si vous essayez juste de comprendre s'il y avait un résultat, vous le faites mal parce que vous ne serez pas capable de faire la différence entre aucun résultat et le résultat étant 0. – Gabe
Gabe la logique de la La fonction n'est qu'un exemple, ce n'est pas utile. – JJoos
Votre modification peut lancer une exception NullReferenceException. Vous devez appeler la méthode statique 'Equals (a, b)'. – SLaks