Анонимные методы работают точно так же, как обычные методы - если компилятор JIT решает встроить их, они могут быть встроены.
Однако, скорее всего, вы не вызываете анонимный метод напрямую - вы вызываете делегата, который указывает на анонимный метод. В этом случае, как и при любом другом делегировании делегата, компилятор не может встраивать что-либо, поскольку он не знает во время компиляции (или JIT-time), какой метод действительно будет вызываться.
Я думаю, вы путать с тем, как дженерики работают в .NET, а не анонимные методы в явном виде, особенно контрастируют с шаблонами С ++ - например, если я collection.Select(i => i.SomeProperty)
в C#, есть еще только один метод Select
[1]; как бы вы встроили метод i => i.SomeProperty
, когда есть другие вызовы Select
, которые принимают разные функции в качестве аргументов? Напротив, использование шаблонов в C++ позволяет встраивать аргументы «функции», поскольку шаблоны являются только функцией генерации кода во время компиляции; любое использование аналогичного шаблона Select
в C++ даст вам отдельный фрагмент кода, при этом не задействован метод.
Излишне говорить, что это всего лишь деталь реализации. Для будущего компилятора было бы целесообразно встраивать вызов метода, делая вид, что он не является делегатом и не встраивает сам метод Select
.
[1] - Технически во время JIT-компиляции может быть несколько версий метода Select
для аргументов другого типа - это не имеет никакого отношения к этому сценарию; он по-прежнему не делает другого метода для всех возможных аргументов.
Любое количество бесплатных .NET-декомпиляторов .NET может показать вам ответ на этот вопрос. –