C # CLR / Вопрос компиляции - PullRequest
3 голосов
/ 17 июня 2011

Я вчера опубликовал этот вопрос о том, что клиент C # 4 развертывает приложение ASP.NET на целевом сервере .NET 3.5 и что C # 3 на сервере компилирует что-то или C # 4 на клиенте.

Этот сценарий был с необязательными параметрами.Я знаю, что дополнительные параметры были поддержаны, как и .NET 1.1.Почему скомпилированный код C # 3 IL не может вызывать скомпилированный код C # 4 с использованием необязательных параметров?

C # 3 просто игнорирует необязательный атрибут?

Ответы [ 3 ]

4 голосов
/ 17 июня 2011

Необязательные параметры были введены в C # только в версии 4.0. (Они были доступны в .NET ранее в VB).

2 голосов
/ 17 июня 2011

Вы правы ... IL просто украшен w / OptionalAttributes, но именно вызывающий компилятор решает, что делать ...

От Рихтера:

Теперь, когда компилятор видит, что у вас есть код, вызывающий метод, в котором отсутствуют некоторые аргументы, компилятор может убедиться, что вы опускаете необязательные аргументы, извлекать их значения по умолчанию из метаданных и встраивать их ...

Так что именно компилятор CALLING решает, что делать с дополнительными функциями, а не вызываемым c # 4.0 IL ...

Подробнее о крайних случаях и о том, как вызывается метод, которыйрешает, что значение можно найти в Lippert, @ http://blogs.msdn.com/b/ericlippert/archive/2011/05/16/optional-argument-corner-cases-part-three.aspx

1 голос
/ 17 июня 2011

Мое простое предположение будет, потому что библиотеки базовых классов отличаются?Это делает разницу между C # 3. * и 4. * намного больше, чем, скажем, 2. * против 3. *, так как последний использовал тот же BCL.

Не уверен, хотя.

...