28 votes

Conception de langage C #: groupe de méthodes à l'intérieur de l'opérateur `is`

Je suis intéressant dans certains choix de conception du langage C#. Il y a une règle en C# spec que permet d'utiliser la méthode des groupes comme les expressions d' is opérateur:

class Foo {
  static void Main() { if (Main is Foo) Main(); }
}

La Condition ci-dessus est toujours faux, comme la spécification dit:

7.10.10 L'opérateur

Si E est une méthode de groupe ou la valeur null littérale, ou si le type de E est un type de référence ou un type nullable et la valeur de E est nulle, le résultat est faux.

Mes questions: quel est le but/le point/la raison d'permettant d'utiliser le langage C# élément sans exécution de la représentation dans le CLR, comme la méthode des groupes à l'intérieur de l'tels "l'exécution" de l'opérateur, comme is?

21voto

Eric Lippert Points 300275

quel est le but/le point/la raison d'permettant d'utiliser le langage C# élément sans exécution de la représentation dans le CLR, comme la méthode des groupes à l'intérieur de l'tels "l'exécution" de l'opérateur, comme l'est?

La langue des design notes d'archives ne font aucune mention des raisons pour lesquelles cette décision a été prise, de sorte que toute deviner la réponse sera une conjecture. Ils ne mentionner que si le résultat de l' "est" peut-être statiquement déterminé à toujours être vrai ou faux, il est déterminé et de produire un avertissement. Il semble plausible que ce pourrait être tout simplement une erreur.

La raison la plus courante pour le tournage de ce qui pourrait à juste titre être une erreur dans un avertissement (ou tout simplement le permettant), c'est parce que diminue le fardeau qui pèse sur les producteurs de programmes de générer automatiquement du code. Cependant, je ne vois pas vraiment convaincante scénario ici.

Mise à JOUR:

Je viens de vérifier le C# 1.0 de la spécification. Il n'a pas cette langue en elle. Il ne dit rien sur les valeurs null ou de la méthode de groupe arguments. Et bien sûr, il ne dit rien sur la méthode du groupe de conversions, car en C# 1.0 il n'y avait pas de méthode implicite groupe de conversions; vous devez explicitement appeler les "nouveaux D(M)" si vous vouliez convertir méthode M d'un délégué de type D.

Ce dernier point est de la justification de la "M est D" renvoyant false plutôt que de vrai; on ne pouvait légalement pas le dire "D D = M;" alors, pourquoi devrait "M est D" être vrai?

Bien sûr, en C# 2.0, moins de sens, puisque vous pouvez dire "D D = M;" en C# 2.0.

J'ai également demandé à l'une des personnes présentes lors de l' "est" l'opérateur a été conçu et il n'avait aucun souvenir de ne jamais trancher cette question d'une manière ou l'autre. Sa méfiance était que la conception originale de "est" l'opérateur a été de ne pas donner les erreurs, seulement des avertissements, et que tout le texte de la spécification de savoir quoi faire avec la méthode des groupes et des valeurs null et autres joyeusetés a été ajouté a posteriori, pour le C# 2.0 version de la spécification, et basé sur ce que le compilateur fait.

En bref, il semble que ce était une conception de trou de C# 1.0 qui a été occultées lors de la spécification a été mis à jour pour C# 2.0. Il ne ressemble pas à ce comportement spécifique a été voulue et délibérément mis en œuvre.

Cette théorie est renforcée par le fait que les méthodes anonymes ne produire une erreur lorsqu'il est utilisé comme un argument pour "est" en C# 2.0. Il ne serait pas d'une modification de rupture pour le faire, mais il serait être une rupture de changement à faire "M est D" tout à coup commencer à retourner true ou être une erreur.

MISE À JOUR:

Alors qu'il enquête sur ce que j'ai appris quelque chose d'intéressant. (Me.) Lorsque la fonction a été conçu à l'origine, le projet était de permettre soit le nom d'un type ou d'un Type d'objet que la droite argument "est". Cette idée a été abandonnée bien avant C# 1.0 fourni si.

3voto

Filip Ekberg Points 22189

Tout d'abord une méthode n'est pas un type, msdn clairement les états suivants:

L'opérateur is utilisé pour vérifier si le type à l'exécution d'un objet est compatible avec un type donné

Exemple

public static void Test (object o) 
{
   Class1 a;

   if (o is Class1) {}
}

À partir de MSDN:

Une expression est évaluée à true si les deux conditions suivantes sont remplies:

  • l'expression n'est pas nulle.
  • l'expression peut être converti en type. C'est un moulage expression de la forme (type)(expression) sera complète sans la levée d'une exception. Pour plus d'informations, voir 7.6.6 Fonte d'expressions.

Donc, la raison pour votre exemple de falsification des terres sur le second point, il convient de moulage d'un type spécifique.

J'espère que je n'ai pas missunderstand la question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X