C#, dynamique type de retour
Ce dont j'ai besoin est une méthode qui peut retourner un type (pas d'objet, de cause pas de casting autorisé) à la suite d'une condition. Voici un exemple:
??? right (string fullStr, int endPosition)
{
string tmpStr = "";
tmpStr = fullStr.Substring(endPosition);
if(tmpStr.Length == 1)
return tmpStr[0]; //return a char!!
else
return tmpStr; //return a string!!
}
J'ai essayé les génériques, mais je n'ai pu retourner le type qui était à venir, (si un char est monté dans un char a été retourné, et si une chaîne est entré dans une chaîne de caractères a été remis).
J'ai essayé ceci:
public static T right<T>(T stringToCheck, int endPosition)
{
if (typeof(T).ToString() == "System.String")
{
string fullString = (string)((object)stringToCheck);
string response = "";
response = fullString.Substring(endPosition);
if (response.Length == 1)
{
return (T)((object)response[0]);
}
else
return (T)((object)response);
}
return stringToCheck;
}
Je ne peux pas utiliser typecasting (de retour d'un objet), ne peuvent pas utiliser ref params.
Les appels à la méthode doit rester le même:
right(stringOrChar,int) -> returns string or char.
Merci
- Peut-être que vous pourriez nous aider. Pourquoi est-ce que vous souhaitez avoir plusieurs types de retour? Pourquoi est-ce que vous voulez un char dans certaines circonstances, et une chaîne de caractères dans d'autres?
- Ok bien la raison pour laquelle je sorte de besoin c'est parce que je suis le portage de beaucoup de code, la syntaxe est la plupart du temps compatible, mais je dois savoir si c'est possible de le faire car il y a beaucoup de " gauche(str,1) < 'x' ", mais d'autres fois, il est tout simplement abc = gauche(str,3). Il semble y avoir pas de distinction nette d'un char à une chaîne de caractères dans la langue ce qui est à venir à partir de. Le but ici est de ne pas toucher au code, SI POSSIBLE, mais ce n'est pas parce que je ne sais pas comment que c'est pas possible 🙂
Vous devez vous connecter pour publier un commentaire.
Le type de retour d'une fonction doivent être dactylographiées. Comme avec n'importe quelle autre variable ou d'une opération, n'importe quel type qui hérite du type spécifié est valide valeur de retour (c'est pourquoi
object
permet à quelque chose comme une valeur).La logistique de l'appelant ne serait pas beaucoup de sens; comment voulez-vous savoir si votre type de variable comme un
char
ou unstring
dans votre exemple?Est-il une raison particulière que vous ne pouvez pas retourner un
string
dans tous les cas?Je ne pense pas que c'est théoriquement possible. Vous pouvez utiliser "dynamique" en C# 4, mais si vous n'y êtes pas encore, vous ne pouvez pas le faire.
Si l'on pouvait retourner une chaîne de caractères ou un personnage, il se doit d'être un objet à la fois de ceux qui descendent de, dont "l'objet" est votre seul choix. Et alors que vous auriez à faire des moulages.
C# (3,5 et précédent) a besoin de savoir ce qu'est le type de retour de la méthode est de sorte qu'il peut faire la vérification de la méthode d'appel. Et en fait, en C#4, quand vous dites "dynamiques", il utilise en fait un "objet" en-dessous.
Vous pouvez créer une classe personnalisée/struct qui a à la fois
Mais encombrants.
Pourquoi voulez-vous d'avoir différents types de retour?
Votre pouvez utiliser
out
paramètres. ou le retour d'un type qui contient à la fois des variations.Dans ce cas particulier, vous pouvez simplement retourner une seule chaîne de caractères. La comparaison de chaînes opère sur leur ordre lexicographique, donc il n'y a aucun besoin d'utiliser des caractères ici (à moins, bien sûr, l'auteur original a été l'utilisation du polymorphisme pour traiter les caractères différemment à partir de chaînes, dans ce cas, vous avez ma sympathie).
méthodes ne peuvent - autant que je sache - le retour d'un type
sorte de retour de l'objet et de la fonte est l'alternative logique
toutefois, notez que si votre conception vous a poussé dans cette situation, il peut y avoir une faille dans; peut-être un peu plus de détails peuvent nous aider à vous aider
remarque: jon skeet est à l'abri de toutes ces restrictions
Enriquev,
Il n'y a pas une façon de mettre en œuvre la droit sans changer la syntaxe de VBA. Vous pouvez spécifier quel type de retour que vous avez voulu, mais c'est essentiellement casting...
Je ne pense pas vraiment que cela résout votre problème.
Est-il possible de faire une regex pour remplacer de tous unique de caractères entourée par des guillemets simples? Cela permettra de rendre les caractères dans les chaînes et de permettre à des opérateurs de comparaison pour le travail.
Quoi à ce sujet:
Cela devrait fonctionner:
De tester ce code:
Sont que vous essayez de faire cela?
Lors de l'appel de cette méthode, vous pouvez faire: