Почему Unity выдает ошибку CS0136, а Visual Studio 2019 - нет? - PullRequest
3 голосов
/ 19 марта 2020

Предположим, у вас есть этот код в Unity (адаптировано из другого вопроса SO ):

public class Test : MonoBehaviour {
    void Start() {
        int x = 0;
        void foo() {
            int x = 0;
            x = 1;
            Debug.Log(x);
        }
    }
}

В Visual Studio 2019 компилятор с радостью принимает этот код, что имеет смысл, учитывая объяснение, предоставленное в ответе SO.

Однако Unity выдает ошибку CS0136 , с сообщением:

ошибка CS0136: локальный или параметр с именем 'x' не может быть объявленным в этой области, потому что это имя используется во внешней локальной области для определения локального или параметра

Это, кажется, ссылается на локальные области (не локальные функции), которые действительно не могут переопределить переменные, объявленные в содержащий объем.

Кажется, что локальные функции действительно работают в Unity (я могу вызвать foo после изменения имен переменных и получить ожидаемый вывод Debug.Log), поэтому мне интересно, почему существует такая разница в компиляторах (и есть ли подтверждение / объяснение этой разницы где-то в документации).

Почему Unity выдает здесь ошибку?

Настройки проигрывателя Unity установлены на Mono для скриптового интерфейса и. NET Standard 2.0 для API совместимость (если это имеет значение).

РЕДАКТИРОВАТЬ: Версия Unity 2019.3.0f6.

1 Ответ

0 голосов
/ 20 марта 2020

Похоже, это результат того, как Unity создает файл csproj, в частности версию языка, которую он устанавливает, и несоответствие между C# 8 и 7,3.

В качестве ссылки, эта функция (скрывающая переменная имена в локальных функциях) была введена в C# 8. Вот ссылка github на изменение. Что касается того, почему в проекте Unity используется C# 8, мое лучшее предположение ниже.

Если вы откроете файл csproj, созданный Unity, вы найдете

<PropertyGroup>
  <LangVersion>latest</LangVersion>
</PropertyGroup>

а также цель 4.7.1 (независимо от настроек вашего проекта Unity)

<TargetFrameworkVersion>v4.7.1</TargetFrameworkVersion>

и определенной константы: CSHARP_7_3_OR_NEWER, которая является константой Unity

Из C# документов на языковых версиях вы можете обнаружить, что, хотя. NET Standard 2.0 по умолчанию равен C# 7.3, приведенное выше значение <LangVersion> подразумевает, что язык версия, используемая в VS, будет последней, к которой она имеет доступ. Вот соответствующий бит из вышеуказанной ссылки:

latest - компилятор принимает синтаксис из последней выпущенной версии компилятора (включая минорную версию).

Так что в В конце концов, похоже, что если вы установили компилятор, который поддерживает C# 8, проект Unity будет настроен таким образом, чтобы это позволяло, хотя даже внутренне, Unity все еще использует C# 7.3.

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