Warum sind die Methodengruppen auf der linken Seite des "is" -Operators erlaubt und wie kann dies in der Praxis verwendet werden?

8

Zu allererst "Eine Methodengruppe ist eine Menge überladener Methoden, die aus einer Member-Suche resultieren". In meinem Beispiel verwende ich den Satz von Console.WriteLine -Methoden mit 19 Überladungen.

Die Definition einer Methodengruppe in der C # -Sprachspezifikation besagt auch Folgendes: "Eine Methodengruppe ist in einem Aufrufausdruck (§7.6.5) zulässig, ein Delegat-Erstellungsausdruck (§7.6.10.5) und als linke Seite eines is-Operators und kann implizit in einen kompatiblen Delegattyp konvertiert werden (§6.6). "

Ich könnte mir ein Szenario vorstellen, in dem diese Funktionalität nützlich sein könnte:

%Vor%

Erste paar Zeilen zeigen, dass wir eine Methodengruppe Console.WriteLine in einen Delegaten "werfen" können. Was tatsächlich passiert, ist die "implizite Konvertierung, die in einen kompatiblen Delegattyp umgewandelt wird", die eine Instanz eines Delegaten erstellt, die eine von vielen überlasteten Console.WriteLine -Methoden mit einer kompatiblen Signatur aufruft.

Gemäß den Spezifikationen könnten wir die Funktion "linke Seite des is-Operators" verwenden, um zu testen, ob die Methodengruppe mit einem bestimmten Delegattyp kompatibel ist (implizite Konvertierung existiert). Dies ist, was in der 'if' Anweisung im Beispielcode überprüft wird.

Überraschenderweise kompiliert der Code, gibt aber eine Warnung "Der angegebene Ausdruck ist niemals vom bereitgestellten Typ ('System.Action')" . Es sieht also so aus, als würde es keine Versuche geben, die Kompatibilität der Methodengruppe und des Delegattyps zur Laufzeit zu überprüfen.

Daher meine Fragen:

  • Warum sind die Methodengruppen auf der linken Seite des Operators 'is' erlaubt, wenn die Überprüfung zur Laufzeit nicht möglich ist?
  • Warum gibt dieses Konstrukt eine Warnung und keinen Kompilierungsfehler?
  • Gibt es irgendwelche praktischen Szenarien für die Verwendung von Methodengruppen auf der linken Seite des "is" -Operators?
  • Ist dies etwas für zukünftige Anwendungen reserviert, d. h. es ist vorgesehen, dass der obige Code eines Tages funktioniert?
Nicol Eye 30.08.2015, 15:22
quelle

1 Antwort

1
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123methods ___ Eine Methode (oft als Funktion, Routine oder Prozedur bezeichnet) ist Code, der eine Aufgabe ausführt und einer Klasse oder einem Objekt zugeordnet ist. ___ qstnhdr ___ Warum sind die Methodengruppen auf der linken Seite des "is" -Operators erlaubt und wie kann dies in der Praxis verwendet werden? ___ antwort32332267 ___

Die Spezifikation (4.0) nennt diesen speziellen Fall ausdrücklich:

  

7.10.10 Der Operator is

     

[...] Das Ergebnis der Operation E is T wobei E ein Ausdruck ist und T ein Typ ist, ist ein boolescher Wert [...]

So weit, so gut. Die Spezifikation wird fortgesetzt:

  

Wenn E eine Methodengruppe ist [...] ist das Ergebnis falsch.

Lassen Sie uns anhand dieser Informationen Ihre Fragen betrachten.

  

Warum sind die Methodengruppen auf der linken Seite des Operators 'ist' erlaubt, wenn die Überprüfung zur Laufzeit nicht möglich ist?

Die Spezifikation erlaubt diesen Vorgang. Siehe Lipperts Antwort auf eine andere Frage , wie es dazu kam.

  

Warum gibt dieses Konstrukt eine Warnung und keinen Kompilierungsfehler?

Das Konstrukt ist syntaktisch gültig, obwohl es immer als falsch ausgewertet wird. Die Warnung ist nur dazu da, um Sie wissen zu lassen, dass Sie etwas unbeabsichtigtes tun.

  

Gibt es irgendwelche praktischen Szenarien für die Verwendung von Methodengruppen auf der linken Seite des 'is'-Operators?

Wahrscheinlich nicht. Vielleicht, wenn Sie ein object übergeben haben, das eine Methodengruppe sein könnte oder etwas anderes sein könnte, könnte dieses Konstrukt nützlich sein. (Es ist zugegebenermaßen ein künstliches Beispiel, das einige ernsthaft fragwürdige Praktiken darstellt.)

  

Ist dies etwas für zukünftige Anwendungen reserviert, d. h. es ist vorgesehen, dass der obige Code eines Tages funktioniert?

Nein. Zitat von Lippert: "Es würde eine brechende Änderung sein, damit" M ist D "plötzlich wieder wahr wird oder ein Fehler ist." [Hervorhebung im Original]

    
___ qstntxt ___

Zu allererst "Eine Methodengruppe ist eine Menge überladener Methoden, die aus einer Member-Suche resultieren". In meinem Beispiel verwende ich den Satz von %code% -Methoden mit 19 Überladungen.

Die Definition einer Methodengruppe in der C # -Sprachspezifikation besagt auch Folgendes: "Eine Methodengruppe ist in einem Aufrufausdruck (§7.6.5) zulässig, ein Delegat-Erstellungsausdruck (§7.6.10.5) und als linke Seite eines is-Operators und kann implizit in einen kompatiblen Delegattyp konvertiert werden (§6.6). "

Ich könnte mir ein Szenario vorstellen, in dem diese Funktionalität nützlich sein könnte:

%Vor%

Erste paar Zeilen zeigen, dass wir eine Methodengruppe %code% in einen Delegaten "werfen" können. Was tatsächlich passiert, ist die "implizite Konvertierung, die in einen kompatiblen Delegattyp umgewandelt wird", die eine Instanz eines Delegaten erstellt, die eine von vielen überlasteten %code% -Methoden mit einer kompatiblen Signatur aufruft.

Gemäß den Spezifikationen könnten wir die Funktion "linke Seite des is-Operators" verwenden, um zu testen, ob die Methodengruppe mit einem bestimmten Delegattyp kompatibel ist (implizite Konvertierung existiert). Dies ist, was in der 'if' Anweisung im Beispielcode überprüft wird.

Überraschenderweise kompiliert der Code, gibt aber eine Warnung "Der angegebene Ausdruck ist niemals vom bereitgestellten Typ ('System.Action')" . Es sieht also so aus, als würde es keine Versuche geben, die Kompatibilität der Methodengruppe und des Delegattyps zur Laufzeit zu überprüfen.

Daher meine Fragen:

  • Warum sind die Methodengruppen auf der linken Seite des Operators 'is' erlaubt, wenn die Überprüfung zur Laufzeit nicht möglich ist?
  • Warum gibt dieses Konstrukt eine Warnung und keinen Kompilierungsfehler?
  • Gibt es irgendwelche praktischen Szenarien für die Verwendung von Methodengruppen auf der linken Seite des "is" -Operators?
  • Ist dies etwas für zukünftige Anwendungen reserviert, d. h. es ist vorgesehen, dass der obige Code eines Tages funktioniert?
___ tag123delegates ___ Delegierte können sich auf mehrere Konzepte beziehen. Ein Objekt kann sich auf einen anderen (einen Delegaten) verlassen, um eine Funktion auszuführen. Die Delegierung kann sich auch auf das Programmiersprachenmerkmal beziehen, das die Methodensuchregeln zum Absetzen von Selbstanrufen verwendet. In C # definiert ein Delegat, welche Methode aufgerufen wird, wenn ein Ereignis ausgelöst wird. ___
theB 01.09.2015, 12:56
quelle

Tags und Links