Once upon a time the C# version matched the version of .Net runtime. But the runtime is kind of a pain to update since all users have to install the new framework. So Microsoft started to add more features to C# to make it more convenient for developers, while still targeting the same runtime, bumping the language version number in the process. This is possible since most language features only require a new compiler, not a new runtime.
So it is perfectly possible to use C# 7.3 while targeting the .Net framework 3.5 runtime. You only need a compatible compiler, and the compiler is part of visual studio.
In later releases Microsoft went back to one language version per runtime pattern. Probably since they now support bundling of the entire runtime with applications. Ofc, now the language version numbers no longer lines up with the .Net version numbers.
But the compiler is flexible enough to handle support on a feature by feature basis. So you can use the LangVersion
flag in your project file to specify the language to use. Some language features will work, some will require features only available in newer runtimes and will not work, and some require workarounds to work. This flag is not officially supported, but I have not encountered any problems using it.
Ofc, if you are still targeting .Net 3.5 it is really time to update, going to 4.8 should be reasonably easy. Higher versions will require more work, but it will need to be done sooner or later if you want to continue supporting the application.