convertir explicitement des paramètres de type générique pour n'importe quelle interface
Dans Les génériques FAQ: les Meilleures Pratiques dit :
Le compilateur va vous permettre de convertir explicitement des paramètres de type générique pour n'importe quelle interface, mais pas à une classe:
interface ISomeInterface
{...}
class SomeClass
{...}
class MyClass<T>
{
void SomeMethod(T t)
{
ISomeInterface obj1 = (ISomeInterface)t;//Compiles
SomeClass obj2 = (SomeClass)t; //Does not compile
}
}
Je vois limitation raisonnable pour les deux, les classes et les interfaces, à moins que la classe/interface n'est pas spécifié comme type de contrainte.
Alors pourquoi un tel comportement, pourquoi il est permis pour les interfaces ?
- ooh un clr question. où est john skeet.
- Je pense que tu veux dire Eric Lippert...
- Juste à noter que l'article lié est à partir de 2005 - les médicaments Génériques ont changé depuis.
- Oui, il peut m'arriver d'être changé. Même alors, c'était quoi l'idée derrière ? Ce qui fait compilateur supposer que le type générique peut être utilisé à n'importe quelle interface ?
Vous devez vous connecter pour publier un commentaire.
Je crois que c'est parce que les acteurs de
SomeClass
peut signifier différentes choses en fonction de ce que les conversions sont disponibles, alors que le casting pourISomeInterface
ne peut être une référence de conversion ou d'un boxe de conversion.Options:
Jeté à l'objet premier:
Utilisation
as
à la place:Évidemment dans le second cas, vous devez également effectuer une nullité vérifiez par la suite en cas
t
est pas unSomeClass
.EDIT: Le raisonnement pour ce qui est donné dans la section 6.2.7 du C# 4 spécification:
object
d'abord de ne pas ajouter tout de la performance.as
- de repérer les erreurs antérieures. Il n'y a rien de spécifique à l'génériques à ce sujet, bien sûr.Dans l'héritage principe de C#, interfaces peut être hérité plusieurs fois, mais une classe juste une fois.
Comme l'héritage d'interfaces complexes, de la hiérarchie,
l' .net framework n'a pas besoin de s'assurer que le type générique T une interface spécifique au moment de la compilation.(EDIT)
Au contraire, une classe ne peut être assurée d'une classe spécifique avec la déclaration d'une contrainte de type à la compilation le code suivant.
where T : ISomeInterface
serait pas valide... il ne serait pas.