Компиляция C# через Unity3D и MonoDevelop

Я использую Unity3D v4.2.2f1, и версия MonoDevelop, с которой он поставляется в комплекте - v2.8.2.

Я вижу, что есть случаи, когда код C# компилируется в Unity3D, но не в MonoDevelop. Например, значения по умолчанию для аргументов метода принимаются Unity3D, но приводят к тому, что «Настройки параметров по умолчанию не разрешены (CS0241)» в MonoDevelop.

Общий совет, который я нашел в Интернете, - не пытаться компилировать из MonoDevelop. Хорошо, но я очень хочу понять, как возникает это несоответствие. Я думал, что и Unity3D, и MonoDevelop компилируют С# с помощью Mono? Дело в том, что Unity3D поставляется с двумя версиями Mono, одной для себя и одной для MonoDevelop? Если да, то почему?

Пример первой строки метода, который компилируется в Unity, но не в MonoDevelop (бит, который не компилируется в MonoDevelop, но компилируется из Unity3D, — это присваивание '=false' setNative):

public static void SetUnityVersion(string path, bool setNative=false) {
    ...implementation...
}

person asinoladro    schedule 25.03.2014    source источник
comment
Я наблюдал это и при 3,5 в очень редких случаях. Можете показать фрагмент кода?   -  person Kay    schedule 25.03.2014
comment
См. выше - обновленный вопрос.   -  person asinoladro    schedule 26.03.2014
comment
Я только что опробовал предоставленный вами код в Unity 3.4.3f1 (Mono 4.0.1), и он отлично скомпилировался. Если я правильно помню, мои проблемы были связаны с тем, что делегаты ссылались на самих себя.   -  person Kay    schedule 26.03.2014
comment
Точно - Unity отлично компилирует (предположительно, используя какую-то версию Mono). Проблема в том, что при попытке скомпилировать из MonoDEVELOP...   -  person asinoladro    schedule 26.03.2014
comment
Нет, извините, я был неточен: я делал это в MonoDevelop 4.0.1, а не в Unity. Я проверил его и с 2.8.2, и он скомпилировался без каких-либо нареканий. Возможно, у вас что-то не так с настройками проекта. Я бы начал новый проект Unity, открыл Mono, добавил скрипт и посмотрел, скомпилируется ли он. Если нет => переустановите, если да, то дело в другом. Кстати, что вы подразумеваете под прототипом метода? C# не поддерживает динамическое добавление методов, как в JavaScript, только методы расширения.   -  person Kay    schedule 27.03.2014
comment
Попробую это, спасибо. Неточная терминология с моей стороны - я имею в виду только первую строку метода, определяющую видимость, тип возвращаемого значения, имя метода и аргументы. За этой строкой следует ее реализация.   -  person asinoladro    schedule 27.03.2014


Ответы (1)


При установке с Unity в Windows MonoDevelop по умолчанию использует Microsoft .Net Framework. И Unity использует «индивидуальную сборку Mono», как указано здесь.

Функция языка, вызывающая ошибку компилятора, называется Необязательные параметры и была введена в C# 4.0. Теперь проекты MonoDevelop, сгенерированные Unity, нацелены на .Net Framework 3.5, который не поддерживает эту функцию.

Если вы измените целевую структуру сгенерированных проектов на .Net 4.0 (в Monodevelop щелкните проект правой кнопкой мыши, затем options->general->Target Framework), все должно скомпилироваться нормально. Но если вы внесете какие-либо изменения в проект в Unity (например, добавите скрипт), файлы проекта MonoDevelop будут перегенерированы, и ваши изменения будут потеряны.

Чтобы обойти эту проблему, вы можете загрузить и установить выпуск Mono для Windows. , затем настройте его как среду выполнения по умолчанию в MonoDevelop (Tools->Options->.Net Runtimes->Add, найдите установленную версию Mono, затем нажмите Set as Default). Monodevelop теперь будет использовать Mono для компиляции вашего кода, а компилятор Mono не будет жаловаться на значения параметров по умолчанию.

Это должно избавить вас от необходимости переключаться между Unity и MonoDevelop только для того, чтобы проверить, компилируется ли код. Протестировано с Unity 4.5.3f3 и MonoDevelop 4.0.1.

person qbik    schedule 08.09.2014