2011-05-02 3 views
4

J'ai une classe générique (C#),C# Convertir T à longue

class MyClass<T> where T : struct, IComparable<T> 
{ 
    public T filelocation; 
} 

T peut être UInt32 ou UInt64 (rien d'autre).

J'ai besoin de convertir emplacementfichier un long à rechercher dans un fichier ...

J'ai essayé ce qui suit

long loc = (T)myclass.filelocation; 

long loc = (T)(object)myclass.filelocation; 

Mais rien ne semble fonctionner ...

Toutes les idées ?

+7

Si vous avez une classe générique/méthode qui ne prend uint ou ulong alors vous êtes probablement abuser ou abuser des génériques. Les génériques sont supposés être * génériques *. Pourquoi ne pas simplement avoir une classe non générique qui prend un ulong? L'uint sera automatiquement converti en ulong. –

+0

Je travaille avec le format de fichier PST. Il a deux formats, ANSI (UInt32) et UNICODE (UInt64). Je le fais de cette façon pour (espérons-le) réduire la duplication de code –

+0

@Eric: Je suis allé votre route. Je l'ai réécrit pour ne pas être générique. –

Répondre

11

Appelez Convert.ToInt64.

L'écriture (object)fileLocation crée une boîte UInt32.
Boxed value types can only be unboxed to their original value types, vous ne pouvez donc pas le convertir en une seule fois en long.
Vous pouvez écrire (long)(ulong)fileLocation, mais cela échouera pour un uint pour la même raison.

+0

Pour cette classe, la classe doit également avoir une contrainte 'IConvertible' – BrokenGlass

+0

@Broken: Non; 'Convert.ToInt64' prend un' object'. Cependant, vous avez raison; il devrait avoir cette contrainte. – SLaks

+0

J'ai fini par réécrire tout pour ne pas être générique. Puisque T ne pouvait être qu'une des deux valeurs, j'ai mis quelques déclarations if là-dedans, là où cela importait ... Mais c'était la route que je suivais avant de réécrire. –

1

Vous pouvez utiliser TryParse:

long lng; 
int testNum = 55; 
long.TryParse(testNum.ToString(),out lng); 
+2

['long.TryParse'] (http://msdn.microsoft.com/en-us/library/zc2x2b1h.aspx) nécessite une chaîne comme paramètre d'entrée, pas un' UInt32' ou 'UInt64', c'est-à-dire qu'il a gagné ' t compile! –

+1

simplement en ajoutant une tostring à cette réponse le rend correct. –

0

avec votre définition de classe si j'écris quelque chose comme

public MyClass<long> myclass = new MyClass<long>(); 
    public long returnLong() 
      { 
       return myclass.filelocation; 
      } 

myclass.fileLocation retour longue par defult

+1

Oui, mais «T» n'est pas «long». – SLaks