Ребят, наступил на грабли и сам поборол проблему, но думаю будет полезно всем.
Итак, есть неуклюжий .NET, созданный доблестными мелкокодерами, учащими нас модульности, принципам SOLID и т.п.;
Допустим, есть задача "на лету" скомпилять C# код, в котором используются новомодные фичи (напр., pattern matching). Простой и везде доступный код...
var csprovider = new CSharpCodeProvider();
var par = new CompilerParameters { GenerateInMemory = true, CompilerOptions = options };
par.ReferencedAssemblies.Add("Microsoft.CSharp.dll");
par.ReferencedAssemblies.Add("System.Core.dll");
var res = csprovider.CompileAssemblyFromSource(par, code);
return res.CompiledAssembly;
...работать не будет. Как не будет он работать и с очевидным параметром:
var csprovider = new CSharpCodeProvider(new Dictionary<string, string> {
["LangVersion"] = "8.0",
});
А грабля кроется в факте, что даже в нововышедшем FW 4.8 вы НЕ МОЖЕТЕ использовать свежий компилятор! Последняя доступная версия в этом FW — 5.0; Хотя казалось бы, а нафига его вообще выпускать, если он недоступен стандартными средствами! Даже мешочник с Павелецкого вокзала понимает, что FW, CSC и VS — это три
разные вещи, проектировка которых просто обязана была предусматривать полную заменяемость и сочетаемость разных версий. Оставим этот траходром на совести тех, кто ещё долго будет нырять в этом болоте. Хак для работы (именно хак, а не очевидная опция) заключается в двух параметрах:
var csprovider = new CSharpCodeProvider(new Dictionary<string, string> {
["CompilerDirectoryPath"] = @"c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Roslyn",
});
options += " -langversion:8.0 ";
И тогда,
достатый из недр студии 2019, новый компилятор позволит вам все фичи.
PS
Я не понимаю, в чём вообще заключается связь между гемороем собеседований в этот распупыренный Мелкософт и теми лоботрясами, что проектируют в нём продукты?! Такую похабщину может проектировать вообще любой стажёр, зашедший в офис MS попить и случайно поступивший на работу. Дикость...