Zostałem dołączony do projektu, w którym używało się Visual Studio 2013 oraz C# w wersji 5.0. Któregoś pięknego dnia, próba skompilowania świeżo pobranego kodu z repozytorium zakończyła się błędami:
Invalid expression term '.'
oraz
Cannot implicitly convert type [nazwa typu] na [inny typ]
Problem okazała się linijka kodu używająca nowych możliwości z C# w wersji 6.0:
return Person?.Name;
OK, pomyślałem w pierwszej chwili, że został podniesiony framework całego projektu, ale nie. Od kolegi dostałem informację, że powinienem sobie zaktualizować MSBuild. No to sobie zaktualizowałem, ale przecież Microsoft Build Tools 2015 z c# 6.0 to wersja 14.0, a Visual Studio 2013 to wersja 12.0, a więc chyba się nie da tak zrobić. Po małym researchu okazało się, że jednak mogę sobie skompilować projekt kompilatorem w wersji nieobsługiwanej – przynajmniej jawnie – przez daną wersję Visual Studio.
A więc podjąłem rękawicę i próbę zainstalowania Microsoft.Net.Compilers. Z zainstalowaniem borykałem się ze dwie godziny, a to dlatego, że przy okazji wystąpił jeszcze jeden problem, który opisałem tutaj, a próba kompilacji zakończyła się częściowym sukcesem. Dlaczego?
- Mimo, że projekt się kompiluje to wciąż pojawiają się błędy na liście błędów co jest bardzo mylące i brzydkie.
- W kodzie intellisense nie podpowie nam składni, a poza tym oznaczy składnię nowszej wersji jako błędną. Podobno R# sobie z tym radzi, ale nie próbowałem.
Reasumując. Osobiście nie próbowałbym sztuczek z wykorzystaniem wersji języka nie w pełni obsługiwanych przez Visual Studio. No chyba, że nie byłoby innego wyjścia, ale w tym konkretnym przypadku wystarczyłoby użyć Visual Studio 2015 i cieszyć się życiem, a nie wyklinać pod niebiosa pomysłodawców rozwiązania.