2009-10-09 6 views
1

Ce qui suit ne compile pasGénériques: les contraintes sur les types nullables

public static T Retrieve<T>(this NameValueCollection collection, String key) where T : Object 
{ 

    if (collection.AllKeys.Contains(key)) 
    { 
     try 
     { 
      val = (T)Convert.ChangeType((object)collection[key], typeof(T)); 
     } 
     catch { } 
    } 

    return val;    
} 

parce que la contrainte ne peut pas être la classe d'objet. Donc, y a-t-il un moyen de contraindre T pour tout ce qui peut être mis à zéro?

+0

Une chose à réaliser est que lorsque T: l'objet signifie que T n'a pas de contrainte. ValueTypes sont des sous-classes de Object. La réponse de Rex M est ce que vous voulez. –

Répondre

13
where T : class 

Votre contrainte actuelle, where T : Object dit « tout ce qui est ou hérite de System.Object », qui est: tout. Tous les types, y compris Int32 et String, héritent de System.Object. Tellement contraignant sur Object ne ferait rien.

Edit: comme d'habitude, Eric brille une lumière sur ce in a far more accurate way:

"en C# chaque type dérive de l'objet". Pas vrai! La façon de corriger ce mythe est simplement de remplacer "dérive de" par "est convertible en", et d'ignorer les types de pointeurs: chaque type de pointeur en C# est convertible en objet.

+0

Je viens de l'essayer et il vous donne les quatre méthodes d'objet: GetType, GetHashCode, ToString et Equals. Mauvaise journée d'hier, tas de messages stupides, désolé. –

+2

C'est en fait un mythe que tous les types héritent de l'objet: http://blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx - Cependant, votre point de vue est bien pris. La raison pour laquelle nous ne permettons pas une contrainte à l'objet est parce que c'est déjà le cas que tous les arguments de type doivent être convertibles en objet, donc c'est une contrainte qui ne signifie rien, et est donc probablement une erreur. –

+3

Cela ne permettra pas un type de valeur NULL pour T, et il veut "tout ce qui peut être mis à un" null "". –

0

Je ne crois pas qu'il soit possible de contraindre votre argument générique uniquement à un type nullable. Vous pouvez facilement le contraindre à un type de référence (comme dans la réponse précédente), mais, alors que tous les types de référence sont nullables, tous les nullables ne sont pas des types de référence.

Questions connexes