Impossible de convertir implicitement le type ‘Int’ en ‘T’

Je peux appeler Get(Stat); ou Get(Name);

Mais en compilant je reçois:

Impossible de convertir implicitement le type ‘int’ en ‘T’

et la même chose pour la ssortingng .

 public T Get(Stats type) where T : IConvertible { if (typeof(T) == typeof(int)) { int t = Convert.ToInt16(PlayerStats[type]); return t; } if (typeof(T) == typeof(ssortingng)) { ssortingng t = PlayerStats[type].ToSsortingng(); return t; } } 

Chaque fois que vous vous trouvez à activer un type dans un générique, vous faites certainement quelque chose de mal . Les génériques doivent être génériques ; ils doivent fonctionner de manière totalement indépendante du type .

Si T ne peut être que int ou ssortingng, n’écrivez pas votre code de cette façon. Écrivez deux méthodes, l’une qui renvoie un int et l’autre qui renvoie une chaîne.

Vous devriez pouvoir utiliser simplement Convert.ChangeType() au lieu de votre code personnalisé:

 public T Get(Stats type) where T : IConvertible { return (T) Convert.ChangeType(PlayerStats[type], typeof(T)); } 
 public T Get(Stats type ) where T : IConvertible { if (typeof(T) == typeof(int)) { int t = Convert.ToInt16(PlayerStats[type]); return (T)t; } if (typeof(T) == typeof(ssortingng)) { ssortingng t = PlayerStats[type].ToSsortingng(); return (T)t; } } 

ChangeType est probablement votre meilleure option. Ma solution est similaire à celle fournie par BrokenGlass avec un peu de logique de “try catch”.

 static void Main(ssortingng[] args) { object number = "1"; bool hasConverted; var convertedValue = DoConvert(number, out hasConverted); Console.WriteLine(hasConverted); Console.WriteLine(convertedValue); } public static TConvertType DoConvert(object convertValue, out bool hasConverted) { hasConverted = false; var converted = default(TConvertType); try { converted = (TConvertType) Convert.ChangeType(convertValue, typeof(TConvertType)); hasConverted = true; } catch (InvalidCastException) { } catch (ArgumentNullException) { } catch (FormatException) { } catch (OverflowException) { } return converted; } 

Essaye ça:

 public T Get(Stats type ) where T : IConvertible { if (typeof(T) == typeof(int)) { return (T)(object)Convert.ToInt16(PlayerStats[type]); } if (typeof(T) == typeof(ssortingng)) { return (T)(object)PlayerStats[type]; } } 

Considérant que la logique @BrokenGlass ( Convert.ChangeType ) ne prend pas en charge le type GUID.

 public T Get(Stats type) where T : IConvertible { return (T) Convert.ChangeType(PlayerStats[type], typeof(T)); } 

Erreur : conversion incorrecte de ‘System.Ssortingng’ en ‘System.Guid’.

Au lieu de cela, utilisez la logique ci-dessous en utilisant TypeDescriptor.GetConverter en ajoutant un espace de noms System.ComponentModel .

 public T Get(Stats type) where T : IConvertible { (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantSsortingng(PlayerStats[type]) } 

Lisez ceci .

Il semble que vous ayez besoin d’un TypeConverter , voir cette entrée de blog .

En fait, vous pouvez simplement le convertir en object puis en T

T var = (T)(object)42;

Un exemple pour bool :

 public class Program { public static T Foo() { if(typeof(T) == typeof(bool)) { return (T)(object)true; } return default(T); } public static void Main() { bool boolValue = Foo(); // == true ssortingng ssortingngValue = Foo(); // == null } } 

Parfois, ce comportement est souhaitable. Par exemple, lorsque vous implémentez ou remplacez une méthode générique à partir d’une classe de base ou d’une interface et que vous souhaitez append des fonctionnalités différentes basées sur le type T