Die Spezifikation für den Compiler definiert the behaviour of lock like so:
Der Kompilierzeittyp des Ausdrucks einer Sperranweisung muss ein Referenztyp oder ein> Typparameter (§25.1.1) sein, der als Referenztyp bekannt ist. Es ist ein Kompilierungsfehler für den Kompilierzeittyp des Ausdrucks, um einen Werttyp zu bezeichnen.
Es definiert dann, was es so lange zu äquivalent ist, wie es
Da-Monitor erstellt.Exit ist nur ein Methodenaufruf ohne irgendwelche Einschränkungen, es verhindert nicht, dass der Compiler automatisch den Int-Befehl eingibt und auf seine fröhliche (und sehr) falsche Art und Weise geht.
lock
ist nicht einfach syntaktischer Zucker in der gleichen Weise foreach
ist nicht einfach syntaktischer Zucker. Die resultierende IL-Transformation ist nicht präsentiert, um den Rest des Codes, als ob das was geschrieben wurde.
In foreach
ist es illegal, die Iterationsvariable zu ändern (obwohl es auf der IL-Ebene im resultierenden Ausgabecode nichts gibt, was dies verhindern würde). In Sperre verhindert der Compiler die Kompilierungszeit bekannter Werttypen, obwohl die resultierende IL sich nicht darum kümmert.
Als Nebenwirkung:
Theoretisch könnte der Compiler mit intimer Kenntnis dieser (und anderen) Methoden ‚gesegnet‘ werden, so dass es offensichtlich Fälle, dass dies geschieht gesichtet, aber im Grunde ist es unmöglich immer diese Stelle an Kompilierzeit (man denke an ein Objekt, das von einer anderen Methode, einer Assembly oder einer Reflektion übergeben wurde), also wäre die Mühe, solche Instanzen zu finden, wahrscheinlich kontraproduktiv.
Je mehr der Compiler über die Interna der API weiß, desto mehr Probleme werden Sie haben, wenn Sie die API in Zukunft ändern wollen.
Es ist zum Beispiel möglich, dass eine Überladung von Monitor.Enter() hinzugefügt werden könnte, die einen Int und einen auf einem Prozess befindlichen Mutex, der dem int-Wert zugeordnet ist, einschloss.
Dies würde den Spezifikationen von Monitor entsprechen (obwohl es wahrscheinlich abscheulich wäre), würde aber massive Probleme für den älteren Compiler verursachen, der immer noch fröhlich eine Operation verhindert, die legal geworden ist.
Ich glaube nicht, dass es eine Überprüfung gibt. Ist die Sperre nicht einfach mit einem Monito.Enter in einem try-Block und Monitor.Exit im finally-Block erweitert. – Sandbox
Nein, es ist erweitert, aber zuerst der Compiler-Spots, wenn Sie auf dem Weg albern sind ... – ShuggyCoUk