Ответ 1
Это не законный С#. Этот полифонический С#. Это исследовательский проект от Microsoft. Стыдно это не точно определено 1 но дело в следующем:
В Polyphonic С#, однако, тело может быть связано с набором (синхронных и/или асинхронных) методов. Мы называем такое определение аккордом, и конкретный метод может появляться в заголовке нескольких аккордов. Тело аккорда может выполняться только после вызова всех методов в его заголовке.
Итак, &
"связывает" эти методы вместе в аккорд, который не будет вызываться до тех пор, пока не будут вызваны все методы в аккорде.
Немного дальше в той же статье:
Эти два метода появляются (разделяются амперсандом) в заголовке одного аккорда, тело которого состоит из оператора return. Предположим теперь, что
b
является экземпляромBuffer
, и потоки производителей и потребителей хотят общаться черезb
. Производители совершают вызовыput()
, которые, так как метод асинхронен, не блокируются. Потребители совершают вызовыget()
, которые, поскольку метод является синхронным, будут блокироваться до тех пор, пока не будет найден соответствующий вызов put(). Как толькоb
получил какput()
, так иget()
, тело запускается, а аргументput()
возвращается в результате вызоваget()
. Несколько вызовов доget()
может быть отложено до полученияput()
для повторного пробуждения одного из них, и несколько вызовов наput()
могут быть сделаны до того, как их аргументы будут потребляться последующимиget()
s.
1: Но такова природа режущей кромки. Я понимаю.