en Java, il est pratique pour la classe d'avoir le paramètre générique, X. Mais la classe de type C # 'S # n'a pas cela.
Ainsi, dans C #, comment est-ce que l'équivalent du code Java suivant?: P>
public <X> X methodThatReturns(Class<X> clazz) { ... }
4 Réponses :
public X methodThatReturns<X>()
{
Type xType = typeof(X); // Type is to C#/.Net what Class<X> is to Java.
}
Merci Ivan, mais je cherche votre méthode pour prendre un "type" de x comme paramètre, plutôt qu'une instance de x ... quelque chose comme le type
Aucun moyen de le prendre en tant que paramètre, mais en C #, vous n'avez pas besoin de le faire comme vous pouvez le faire dans la méthode même s'il n'a pas de paramètre: type x = typeof (x) code> . Le type est l'équivalent de la classe en C #.
C'est très malheureux. Pour ne pas avoir un moyen d'exprimer un type de retour dynamique via le type transmis et obtenir la vérification du type de compilateur est très limitée pour certains cas.
en C #, il serait et vous pouvez obtenir le type de x à l'aide de typeof (x) code> au lieu d'utiliser le paramètre Clazz code > p> p>
Je ne suis pas à 100% sur les génériques Java ... essayez-vous de déclarer une méthode qui renvoie le même type qu'il a été transmis?
public T MethodThatReturns<T>()
{
Type clazz = typeof(T);
....
}
Je connais avec Java et .NET Generics et j'utilise la classe C'est tout très simple et la chose importante est que je n'ai pas à créer un objet factice à passer à la fonction, je viens de l'appeler comme suit: p> une autre chose importante à noter est que le Le paramètre CLS n'est pas utilisé du tout. C'est seulement un moyen de donner un type de béton pour x. P> la façon dont vous faites la même chose est un peu différent dans C #. Vous pensez peut-être que la même fonction ressemblerait à ceci comme ceci: p> mais vous seriez mauvais. EM> P> P> Le Le problème est que Java utilise une astuce appelée Erasure EM>, qui signifie essentiellement que lorsque le code est en réalité compilé, tous les paramètres génériques sont supprimés du code. Donc, dans le monde de la machine virtuelle Java, il n'y a pas une telle chose qu'une liste en C #, il n'y a pas d'effacement de type et de génériques sont forts> appliqués au moment de l'exécution. Cela signifie que les éléments suivants généreraient une exception d'exécution lorsqu'il serait utilisé avec la fonction ci-dessus: p> la raison est que Liste code> et autres non génériques les types. Cela signifie que les génériques ne sont là que là pour vous aider à coder et ne sont pas appliqués au moment de l'exécution. P> list Liste list List<long> lstLng = new List<long>();
lstLng.Add(1);
List<int> lstInt = lstLng.Cast<int>().ToList();
List<string> lstStr = lstLng.Select(lng => lng.ToString()).ToList();
Lire intéressante. Je suis content que vous ayez trouvé ces méthodes LINQ utiles dans votre situation actuelle. Je ne pense pas qu'il y ait quelque chose de spécial caché derrière eux, cependant. J'ai créé ma propre méthode d'extension detype
@slattery en fait, la variance ne s'applique pas aux classes, uniquement des interfaces et des délégués. La liste est implémente iEnumérable, qui est covariante cependant, vous pouvez donc faire quelque chose comme ienumerable Objet> lstobj = (liste list
@slattery Consultez cet article pour plus d'informations sur la variance: MSDN.MicRosoft.com/ EN-US / Bibliothèque / DD799517.aspx . Il est intéressant de noter que ienumbertables
msdn.microsoft.com/en-us/Library /ms379564(V=VS.80).aspx
Je ne suis pas une grande partie d'un programmeur C #, mais je pense que cet idiome est beaucoup moins courant dans C # car c # n'a pas d'effacement de type. Les informations de type générique sont conservées, non perdues, au moment de l'exécution.
Ne pense pas qu'il y en a un.
Note à @slattery: Les génériques ont été ajoutés à partir de .NET 2.0 / C # 2 / Visual Studio 2005. Si vous utilisez .NET 1.1 / C # 1.2 / Visual Studio 2002/2003, vous n'avez pas de chance.