en utilisant des méthodes d'extension sur int
Je suis en train de lire sur les méthodes d'extension, et monkeying autour avec eux
pour voir comment ils fonctionnent, et j'ai essayé ceci:
namespace clunk {
public static class oog {
public static int doubleMe(this int x) {
return 2 * x;
}
}
class Program {
static void Main() {
Console.WriteLine(5.doubleMe());
}
}
}
et cela a fonctionné comme prévu, le succès de l'extension de type int, avec la doubleMe méthode d'impression 10.
Prochaine, être un vieux C gars, je me demandais si je pouvais faire cela:
namespace clunk {
public static class BoolLikeC {
public static bool operator true(this int i) { return i != 0; }
public static bool operator false(this int i) { return i == 0; }
}
class Program {
static void Main() {
if ( 7 ) {
Console.WriteLine("7 is so true");
}
}
}
}
Je pense que si le premier travail, celui-ci doit travailler pour faire en sorte que
un int utilisé dans un contexte booléen appelez la méthode d'extension sur int, vérifiez que
7 n'est pas égal à 0, et renvoie la valeur true. Mais au lieu de cela, le compilateur n'aime même pas le
plus tard, le code et met le rouge des traits ondulés en vertu de la deux ce et dit de Type "attendu".
Pourquoi ne pas ce travail?
source d'informationauteur Dave
Vous devez vous connecter pour publier un commentaire.
Très intelligent! Une belle tentative, mais malheureusement nous n'avons pas de mettre en œuvre "extension de tout"juste des méthodes d'extension.
Nous avons examiné la mise en œuvre de l'extension de propriétés, de l'extension des opérateurs, de l'extension des événements, de l'extension des constructeurs, des interfaces d'extension, vous le nom, mais la plupart d'entre eux n'ont pas été suffisamment convaincante pour le faire en C# 4 ou de la prochaine version de C#. Nous avons comme la conception d'une syntaxe pour le genre de chose que vous mentionnez. Nous avons obtenu assez loin sur l'extension de propriétés; nous presque a obtenu l'extension de propriétés en C# 4, mais il a fini pas. La triste histoire est ici.
http://blogs.msdn.com/b/ericlippert/archive/2009/10/05/why-no-extension-properties.aspx
Donc, longue histoire courte, pas cette particularité, mais nous allons en tenir compte pour hypothétiques futures versions de la langue.
Vous pouvez bien sûr faire un "
ToBool()
" méthode d'extension surint
si vous l'appréciez vraiment le rétro convention C que non-nulle signifie-vrai.Les méthodes d'Extension sont exactement ce que les méthodes.
Vous ne pouvez pas faire d'extension des opérateurs ou des propriétés.
Si cela avait été possible, elle aurait pour résultat très dur à lire le code.
Si vous n'êtes pas familier avec le code de base, il est presque impossible de comprendre ce
if (7)
moyens.Comme d'autres l'ont dit, il n'y a pas une telle chose comme une extension des opérateurs en C#.
Le plus proche que vous pouvez obtenir, en courant le risque de faciliter beaucoup de méchants bugs en bas de la ligne, avec la conversion implicite opérateurs sur une mesure "le pont" type:
Malheureusement vous ne pouvez pas introduire de nouveaux opérateurs, ou de mettre en œuvre prend en charge pour les opérateurs, sur les types, par le biais de méthodes d'extension.
Fondamentalement, ce que vous voulez faire ne peut pas être fait.
La seule façon d'introduire de nouveaux opérateurs est de les placer dans l'un des types. Pour les opérateurs binaires, vous pouvez les mettre dans votre propre type, à condition que votre type de est l'un des deux, pour unaire types vous avez besoin de mettre de l'opérateur à l'intérieur du type lui-même.
Puisque vous ne pouvez pas prolonger une
int
en aucune façon, vous ne pouvez pas le faire.Console.WriteLine(5.doubleMe());
est équivalent à
Console.WriteLine(oog.doubleMe(5));
Étant donné que, vous pouvez voir pourquoi
if ( 7 )
ne fonctionne pas.Les méthodes d'Extension sont rien de plus que de la syntaxe.
Comme une note de côté, car il est de la syntaxe, vous pouvez appeler les méthodes d'extension sur
null
variables parce qu'elle se traduit par une méthode normale d'appel, et les méthodes peuvent prendre les paramètres nuls.Malheureusement vous ne pouvez pas utiliser les méthodes d'extension pour ajouter des opérateurs, et de conversion de type implicite en C# est mis en œuvre comme un opérateur.
Dans le premier cas, vous écrivez une méthode d'extension - par exemple, l'extension de la fonctionnalité de la
int
type de données. Dans le deuxième code, vous essayez de remplacer le bool opérateurs. Ce sont deux choses totalement différentes.