在编译时检测C#版本

A.P*_*cat 5 c#

是否可以使用预处理程序指令检测当前版本的C#是否为6或更高,因此在编译时?

我想做这样的事情:

var myVar = ...;
string name;

#if VERSION_6_OR_MORE
    name = nameof(myVar);
#else
    name = "myVar";
#endif
Run Code Online (Sandbox Code Playgroud)

我使用Visual Studio 2015和C#6,所以我可以使用nameof().其他想要编译此代码的人可能正在使用旧版本,但nameof()不存在.

我想使用预处理器指令,所以我可以保留nameof()在C#6中,但是不使用该版本的其他人也可以编译它.

小智 7

您可以在项目文件中显式指定语言版本并定义条件常量:

<LangVersion>6</LangVersion>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<DefineConstants Condition="'$(LangVersion)' == '6'">DEBUG;TRACE;LANG_VERSION_6</DefineConstants>
Run Code Online (Sandbox Code Playgroud)


Cod*_*ter 5

nameof()经营者是指,以降低维护:使用它,你不必隐藏在字符串标识符,所以当你重命名一个变量,参数或成员,在您使用它(例如一个地方ArgumentNullException(nameof(paramName)))将被更新,当您重构paramName名称.

现在用你的方法,你有效地加倍您的维护表面,而不是降低它(因为你现在有两个字符串变种nameof()版本,两者保持不必),否定使用nameof()完全.

因此,如果您想支持较旧的C#版本,请坚持使用适用于这些版本的功能:在字符串中使用标识符.

  • 或告诉你的同事更新VS :) (3认同)