2009-07-08 6 views
1

J'ai un doute concernant le moulage.Paramètre Casting and Out

public void Test(out T a, out T b) 
    { 

     object d,e; 
     d = 10; 
     e = 35; 
     Console.WriteLine(d.GetType()); 
     a = (T)d; 

     b = (T)e; 

    } 

Ici, d.getType() renvoie System.int32. donc ma question est pourquoi ne pouvons-nous pas directement coder quelque chose comme a = (T) 10; Je ne comprends pas correctement. Merci.

Répondre

8

La diffusion ne fonctionne pas de cette façon. T doit être une sous-classe ou une super-classe de System.int32 pour que la conversion fonctionne sans surcharger l'opérateur.

Je suppose que T est un wrapper d'une sorte pour un int. Vous devez créer une fonction ou un constructeur pour convertir int en T. Ce n'est pas la même chose que le casting.

Vous pouvez définir votre propre opérateur explicit qui fera cette conversion pour vous, et la syntaxe sera la même que celle que vous avez. Mais vous devez encore définir la conversion vous-même.

Quelque chose comme ceci:

public static explicit operator T (int original) { 
    T t = new T(); 
    t.value = original; 
    return t; 
} 
+0

Ok, j'ai compris: "T doit être une sous-classe ou une super-classe de System.int32 pour lancer le travail." .. c'est la clé .thats pourquoi l'objet fonctionne comme il est la base de tout.correct moi si je me trompe.Merci pour l'aide. – Wondering

2

supposer que ce soit pour une classe générique de type T, la question est pourquoi échouer une façon et pas l'autre?

Comme d est un objet, (T)d représente une opération de déballage plutôt qu'une distribution. Unboxing est fait au runtime et ainsi survivre à la compilation. J'imagine que si le type T est autre chose qu'un int alors cette étape échouera pendant l'exécution.

D'autre part, (T)10 est une opération de moulage - qui est vérifiée par type à à la compilation. Si vous n'avez pas d'opérateur de transtypage entre T et int (comme décrit dans la réponse de Welbog), ceci ne peut pas être compilé.

+0

oui son int..n'importe quoi d'autre que int lancera une exception de cast Invalid. BTW existe-t-il une règle d'or pour décider entre le casting haut-bas et le box-unboxing? AFAIK boxe, unboxing dénote la conversion de la valeur -> ref et ref-> value..and up-downcasting fonctionne généralement avec la classe de base et la sous-classe, comme upcasting peut être fait facilement, mais pour downcasting nous devons le déclarer explicitement.Merci – Wondering

+0

Comme d était un objet alors d = 10 et (T) d représentaient la boxe et le déballage. Si d était autre chose qu'un Objet, cela aurait été une distribution. –

Questions connexes