Valeur de type 'T' ne peut pas être converti à
C'est probablement une question de novice, mais google étonnamment n'a pas répondu.
J'ai plutôt artificielle méthode
T HowToCast<T>(T t)
{
if (typeof(T) == typeof(string))
{
T newT1 = "some text";
T newT2 = (string)t;
}
return t;
}
À venir à partir d'un C++ fond, j'ai attendu à ce travail. Cependant, il ne parvient pas à compiler avec "Impossible de convertir implicitement le type" T "à la chaîne" et "Ne peut pas convertir de type" T "à la chaîne" pour les deux missions.
Je suis soit faire quelque chose de conceptuellement mal ou tout simplement avoir la mauvaise syntaxe. Merci de m'aider à trier ce coup.
Merci!
- IMO, si vous êtes à la vérification de types dans votre génériques de code, puis les génériques ne sont probablement pas la bonne solution à votre problème.
- L'expression
typeof(T) == typeof(string)
est résolu au moment de l'exécution, et non pas au moment de la compilation. Donc la ligne suivante dans le bloc n'est pas valide. - (T)Convertir.ChangeType(newT1, typeof(T))
- Ne fonctionne que si l'objet à mettre en œuvre IConvertible. Douceur si il le fait bien.
Vous devez vous connecter pour publier un commentaire.
Même si c'est à l'intérieur d'un
if
bloc, le compilateur ne sait pas queT
eststring
.Par conséquent, il ne vous laisse pas exprimés. (Pour la même raison que vous ne pouvez pas convertir
DateTime
àstring
)Vous avez besoin de jeter à
object
, (qui de touteT
pouvez lancer), et à partir de là àstring
(depuisobject
peut être coulé àstring
).Par exemple:
T
:var isBlank = (userDefinedValue is string) && String.IsNullOrWhiteSpace(userDefinedValue as string);
(string) new DateTime()
.Les deux lignes ont le même problème
Le compilateur ne sait pas que T est une chaîne de caractères, et a donc aucun moyen de savoir comment assigner.
Mais depuis que vous avez vérifié que vous pouvez forcer avec
vous n'avez pas besoin de lancer le t, puisqu'elle est déjà une chaîne de caractères, aussi besoin d'ajouter la contrainte
Si vous êtes à la vérification de types explicites, pourquoi êtes-vous déclarer ces variables comme
T
s'?T
.object
valeurs, avec les types dérivés qui magasinstring
valeurs. Supposons que ces champs ont aussi une "DefaultIfNotProvided" de la valeur, de sorte que vous devez vérifier si l'utilisateur a fourni une valeur (qui peut être un objet ou une chaîne de caractères ou même un numérique primitive) est équivalent àdefault(T)
. La chaîne peut être traitée comme un cas particulier où un vide/les espaces de chaîne est traité de la même façon que par défaut(T), de sorte que vous voudrez peut-être vérifier siT userValue; var isBlank = (userValue is string) && String.IsNullOrWhitespace(userValue as string);
.Vous pourrez également obtenir cette erreur si vous avez un générique de la déclaration de votre classe et de votre méthode. Par exemple, le code ci-dessous donne cette erreur de compilation.
Ce code ne compile (note T supprimés à partir de la méthode de déclaration):
Modifier cette ligne:
Pour cette ligne: