2010-02-12 6 views
2

Je voudrais déclarer une classe générique simple où une méthode appelée Addition prendrait deux variables génériques et les ajouter ensemble en utilisant l'opérateur +. Je pensais que je pouvais accomplir cela en donnant classe simple la contrainte suivante:contraintes, variables génériques et les opérateurs arithmétiques

class Simple<T> where T: int 
{ 
    public T Addition(T firstInt, T secondInt) 
    { 
     return firstInt + secondInt; 
    } 
} 

Je soupçonne que l'erreur a quelque chose à voir avec les médicaments génériques n'ayant les cinq types de contraintes suivantes - ClassName, classe, struct, InterfaceName, nouveau (? Ainsi, pourquoi les génériques ne prennent-ils pas en charge StructureName type de contrainte? De cette façon, nous serions en mesure d'appliquer des opérateurs arithmétiques sur des variables génériques ?!

Thanx

Répondre

3

Une contrainte StructName n'aurait pas de sens, car vous ne pouvez pas hériter des types de valeurs.

Si vous aviez quelque chose comme class Simple<T> where T : int vous pouvez seulement instancier Simple<T> avec T = int, aucun type hérite de int ou tout autre type de valeur pour cette question.

C# (le CLR) manque ce que d'autres langues connaissent comme type classes, un mécanisme populaire pour gérer la surcharge de l'opérateur sans mécanique de compilateur codée en dur (comme en C#).

+0

merci à tous pour votre aide à votre santé :) – AspOnMyNet

2

Il n'y a pas de point de contraindre un type générique à un struct spécifique, puisque les types struct ne peuvent être héritées. Ce serait identique à l'écriture:

class Simple 
{ 
    public int Addition(int firstInt, int secondInt) 
    { 
     return firstInt + secondInt; 
    } 
} 

Malheureusement, avec le soutien d'un IArithmetic interface, les types génériques avec des opérations mathématiques sont difficiles à soutenir. Si vous voulez voir une approche pour les opérateurs mathématiques génériques, regardez le Generic Operators in MiscUtil.

1

Vous contraignez T à int. Ce n'est pas une chose sensée à faire, car il n'y a qu'un seul type int; donc vous pouvez directement écrire int si vous voulez int.

Si vous ne contraignez pas T, vous ne pouvez pas utiliser l'opérateur +, car aucun opérateur + n'est défini sur l'objet.

Les génériques C# ne sont pas des modèles C++.

Questions connexes