J'ai une méthode générique avec ce code (factice) (oui, je sais que 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
"Impossible de convertir null en paramètre de type 'T' car il pourrait s'agir d'un type de valeur. Envisagez d'utiliser plutôt 'default (T)'."
Puis-je éviter cette erreur?
null
indépendamment du fait queT
estObject
ouint
ouchar
.Réponses:
Deux options:
default(T)
ce qui signifie que vous retournereznull
si T est un type de référence (ou un type de valeur nullable),0
forint
,'\0'
forchar
, etc. ( tableau des valeurs par défaut (référence C #) )where T : class
contrainte, puis reveneznull
normalementla source
Nullable<int>
ou à laNullable<DateTime>
place. Si vous utilisez un type non nullable et devez représenter une valeur nulle, vous demandez simplement des problèmes.la source
Vous pouvez simplement ajuster vos contraintes:
Le retour de null est alors autorisé.
la source
IDisposable
. Oui, la plupart du temps, ce n'est pas obligatoire.System.String
ne met pas en œuvreIDisposable
, par exemple. Le répondeur aurait dû clarifier cela, mais cela ne rend pas la réponse fausse. :)Ajoutez la contrainte de classe comme première contrainte à votre type générique.
la source
Si vous avez un objet, vous devez alors transtyper
si vous devez retourner null.
la source
Voici les deux options que vous pouvez utiliser
ou
la source
Votre autre option serait d'ajouter ceci à la fin de votre déclaration:
De cette façon, cela vous permettra de retourner null.
la source
where T : class, IList
. Si vous avez des contraintes sur différents types, vous répétez le jetonwhere
, comme danswhere TFoo : class where TBar : IList
.solution de TheSoftwareJedi fonctionne,
vous pouvez également l'archiver en utilisant un couple de types valeur et nullable:
la source
Prenez la recommandation de l'erreur ... et soit utilisateur
default(T)
ounew T
.Vous devrez ajouter une comparaison dans votre code pour vous assurer qu'il s'agissait d'une correspondance valide si vous suivez cette route.
Sinon, envisagez potentiellement un paramètre de sortie pour "correspondance trouvée".
la source
Voici un exemple de travail pour les valeurs de retour Nullable Enum:
la source
where TEnum : struct, Enum
. Cela garantit qu'un appelant ne fournit pas accidentellement un type de valeur qui n'est pas une énumération (comme unint
ou unDateTime
).Une autre alternative aux 2 réponses présentées ci-dessus. Si vous changez votre type de retour en
object
, vous pouvez retournernull
, tout en castant le retour non nul.la source
Par souci d'exhaustivité, il est bon de savoir que vous pouvez également le faire:
Il renvoie le même que
return default(T);
la source
Pour moi, ça marche comme ça. Où est exactement le problème?
la source