Les moyens de jeter des objets à un type générique
Par rapport à Casting générique de type "T" tout en mettant en place le type de T
Et avec l'exemple suivant
private static T deserialize<T>(string streng) where T : class
{
XmlSerializer ser = new XmlSerializer(typeof(T));
StringReader reader = new StringReader(streng);
return ser.Deserialize(reader) as T;
}
et
private static T deserialize<T>(string streng)
{
XmlSerializer ser = new XmlSerializer(typeof(T));
StringReader reader = new StringReader(streng);
return (T)ser.Deserialize(reader);
}
Je suis habituée à faire de la object as Type
casting, donc j'étais un peu perplexe quand j'ai constaté que je ne pouvais pas juste faire avec T
. Ensuite, j'ai trouvé la question ci-dessus et qu'une solution à la as T
d'erreur du compilateur.
Mais pourquoi est where T : class
nécessaire lors de l'utilisation de object as T
et non pas lors de l'utilisation de (T)object
?
Quelle est la réelle différence entre les deux façons de moulage de l'objet?
Oh oui, merci abatishchev. Beaucoup plus lisible sans les espaces de noms 🙂
OriginalL'auteur Heki | 2010-12-21
Vous devez vous connecter pour publier un commentaire.
Parce que
as
implique le casting pourrait échouer et retourner la valeur null. Sans: class
,T
pourrait êtreint
etc - qui ne peut pas êtrenull
. Avec(T)obj
il va tout simplement exploser dans une gerbe d'étincelles; pas besoin de gérer unnull
.Comme une parenthèse (ré
struct
), vous peut utilisationas
si l'on sait que vous êtes casting pour unNullable<>
- par exemple:Bien et de manière concise les mettre!
C'est très instructif. Je accepter votre réponse, mais le système me dit d'attendre huit minutes.
La documentation MSDN peuvent être trouvés ici: msdn.microsoft.com/en-us/library/cscsdfbt(v=VS.100).aspx (pour plus de lecture)
"exploser dans une gerbe d'étincelles" 🙂
OriginalL'auteur Marc Gravell
Casting avec "comme" est spécifié pour 1) effectuer le cast s'il le peut, et 2) de retour
null
si elle ne peut pas. C'est problématique avec une contrainte de paramètre générique (votre deuxième exemple), parce que T pourrait être un type de la valeur (commeint
), des variables qui ne peuvent pas tenirnull
.Lorsque votre paramètre générique est contraint d'être un type de référence (avec le
class
contrainte), le compilateur ne peut pas raisonner sur votre taper un peu plus et de comprendre quenull
sera toujours une valeur valide pour le type T. par conséquent, le "comme"de style casting peut être utilisé en toute sécurité.OriginalL'auteur Ben
Autant que l'opérateur
as
retournenull
en cas d'échec, la variable doit être une classe ou nullable struct:Pendant ce temps
cast
exige rien de tout cela et vous pouvez lancer struct sur les struct.OriginalL'auteur abatishchev
(T)obj
jette siobj
n'est pas convertible àT
. Vous devez utiliser(T)obj
si vous êtes certain que la conversion fonctionne.Et l'utilisation
as
pour remplacer un test avecis
suivie par un casting. Bien sûr, T doit être nullable(soit un type de référence ou unNullable<T>
) depuisas
retourne null en cas d'échec. Le modèle typique est:Une autre différence est que
as
ne fonctionne que pour un sous-ensemble de conversions. Surchargé jette etc seront ignorés.Deserialize
retourneobject
, de conversions, de ne pas appliquer de toute façonOui, et dans ce cas, il doit utiliser le
(T)x
fonte de toute façon, depuis qu'il sait que le résultat est de typeT
.OriginalL'auteur CodesInChaos