Метод расширения и метод участника: почему каждый реализован по-разному с помощью компиляторов (внутренне)?

Рассмотрим этот код:

 A a = null;
 a.f(); //Will it throw NullReferenceException?

будет вышеупомянутый бросок NullReferenceException ?

Ответ: Это зависит от того, что f () ] является.

Эта разница приводит к вопросу: как каждый тип метода реализуется и просматривается C # компиляторы? Кроме того, почему метод участника должен выбрасывать исключение , даже если он не доступа к ним данных элемента ? Кажется, что компилятор C # заранее приводит к предположению , что метод участника будет получать доступ к данным пользователя, и поэтому он выбрасывает исключение, если объект NULL, так как использование данных элементов NULL объекта не может быть доступен. Однако в случае метода расширения он откладывает это решение до него на самом деле , пытается получить доступ к данным пользователей, используя нулевые ссылки, только тогда он бросает исключение .

Как далеко мое понимание правильно? И если это так, почему эта разница?

Да, я знаю, что если f () - это метод расширения, то AF () эквивалентно написанию AEXT.F (A) , поэтому последние не должны бросать исключение до A A для доступа к участнику. Но мой фокус в основном в реализациях компилятора (который может реализовать даже методы участников таким же образом).

5
задан Nawaz 3 September 2011 в 19:43
поделиться