Question Comment puis-je retourner NULL d'une méthode générique en C #?


J'ai une méthode générique avec ce code (fictif) (oui je suis conscient qu'IList a des prédicats, mais mon code n'utilise pas IList mais une autre collection, de toute façon ce n'est pas pertinent pour la question ...)

static T FindThing<T>(IList collection, int id) where T : IThing, new()
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return thing;
    }
    return null;  // ERROR: Cannot convert null to type parameter 'T' because it could be a value type. Consider using 'default(T)' instead.
}

Cela me donne une erreur de construction

"Ne peut pas convertir null en paramètre de type   'T' parce que cela pourrait être un type de valeur.   Pensez à utiliser 'default (T)' à la place. "

Puis-je éviter cette erreur?


444


origine


Réponses:


Deux options:

  • Revenir default(T) ce qui signifie que vous reviendrez null si T est un type de référence (ou un type de valeur nullable), 0 pour int, '\ 0' pour char etc
  • Restreindre T à être un type de référence avec le where T : class contrainte, puis retour null comme d'habitude

781



return default(T);

63



Vous pouvez simplement ajuster vos contraintes:

where T : class, IDisposable

Ensuite, le retour de null est autorisé.


22



Ajoutez la contrainte de classe comme première contrainte à votre type générique.

static T FindThing<T>(IList collection, int id) where T : class, IThing, new()

10



  1. Si vous avez un objet, alors vous devez saisir

    return (T)(object)(employee);
    
  2. si vous devez retourner null.

    return default(T);
    

6



Votre autre option serait d'ajouter ceci à la fin de votre déclaration:

    where T : class
    where T: IList

De cette façon, il vous permettra de retourner null.


5



solution des travaux de TheSoftwareJedi,

Vous pouvez également l'archiver en utilisant deux types de valeur et nullable:

static T? FindThing<T>(IList collection, int id) where T : struct, IThing
{
    foreach T thing in collecion
    {
        if (thing.Id == id)
            return thing;
    }
    return null;
}

2



Voici les deux options que vous pouvez utiliser

return default(T);

ou

where T : class, IThing
 return null;

2