Взаимное исключение является взаимоисключающим флагом. Это действует как контролер к разделу кода, позволяющего одному потоку войти и блокирующего доступ ко всем другим. Это гарантирует, что код, которым управляют, будет только поражен единственным потоком за один раз. Просто обязательно выпустите взаимное исключение, когда Вы будете сделаны.:)
Методы экземпляра имеют приоритет над методами расширения. Ваше наблюдение является доказательством того же.
Решая, какой метод вызывать, он всегда будет выбирать соответствующий метод экземпляра вместо метода расширения ... что в некотором смысле интуитивно понятно.
Подробно перефразировано из C #,
Когда компилятор видит, что вы пытаясь вызвать метод, который выглядит как метод экземпляра, но не может чтобы найти его, он ищет методы расширения (которые видны на основе ваших
с использованием директив
) . В случай нескольких кандидатов в качестве целевой метод расширения, тот, у которого "лучшая конверсия" похожа на перегрузка (например, если IChild и IBase оба имеют аналогичный метод расширения определено .. IChild.ExtensionMethod is selected)
Также может быть скрытый взломщик кода, допустим, TypeA не имеет SecretMethod в качестве метода экземпляра в Libv1.0. Итак, вы пишете метод расширения SecretMethod. Если автор вводит метод экземпляра с таким же именем и сигнатурой в v2.0 (без параметра this
), и вы перекомпилируете свой исходный код с последней n-лучшей версией Libv2. 0, все существующие вызовы метода расширения теперь будут автоматически перенаправляться на новый метод экземпляра .
Это правильное поведение. Причина в том, что введение метода расширения не должно изменять способ выполнения существующего кода. Код должен вести себя точно так же с этим «лишним» методом расширения или без него. В некоторых случаях (например, в вашем) это может показаться нелогичным, но на это есть причина.
Код должен вести себя точно так же с этим «лишним» методом расширения или без него. В некоторых случаях (например, в вашем) это может показаться нелогичным, но на это есть причина. Код должен вести себя точно так же с этим «лишним» методом расширения или без него. В некоторых случаях (например, в вашем) это может показаться нелогичным, но на это есть причина.