C# 我可以使预处理器指令依赖于.NET framework版本吗?
这里有一个我想做的具体例子 考虑C# 我可以使预处理器指令依赖于.NET framework版本吗?,c#,.net,frameworks,c-preprocessor,preprocessor-directive,C#,.net,Frameworks,C Preprocessor,Preprocessor Directive,这里有一个我想做的具体例子 考虑字符串.Join函数。在.NET 4.0之前,只有两个重载,都需要string[]参数 从.NET4.0开始,有一些新的重载采用了更灵活的参数类型,包括IEnumerable 我有一个库,其中包含一个Join函数,它基本上实现了.NET4.0string.Join函数的功能。我只是想知道我是否可以使这个函数的实现依赖于目标.NET框架。如果是4.0,它可以在内部调用string.Join。如果是3.5或更高版本,它可以调用自己的内部实现 这个想法有意义吗 如果它确
字符串.Join
函数。在.NET 4.0之前,只有两个重载,都需要string[]
参数
从.NET4.0开始,有一些新的重载采用了更灵活的参数类型,包括IEnumerable
我有一个库,其中包含一个Join
函数,它基本上实现了.NET4.0string.Join
函数的功能。我只是想知道我是否可以使这个函数的实现依赖于目标.NET框架。如果是4.0,它可以在内部调用string.Join
。如果是3.5或更高版本,它可以调用自己的内部实现
IEnumerable
参数调用string.Join
,在针对早于4.0的.NET版本时甚至不会编译;因此,无论我使用什么方法,都必须在编译之前进行。(例如,在运行时检查Environment.Version
属性将不起作用。)您可以看一看关于堆栈溢出的另一个问题,该问题说明了如何通过项目文件的XML设置条件常量:
然后使用它,您可以确定是应该使用.NET 4重载还是您自己的库。是的,我认为这是有意义的(对于您的特定情况,因为更改相对较小),尽管很明显,这类事情可能会很快失去控制 依我看,最合乎逻辑的方法是为每个版本创建不同的解决方案/项目配置,然后在4.0配置中定义自定义符号(例如,
NET40
),然后将其与#if
一起使用。我不确定配置是否允许您更改运行时版本(这显然是一个完美的解决方案),但最坏的情况是必须手动更改版本
编辑:我刚刚在Joshua的回答中看到了链接到的答案,这似乎是一个更精简的解决方案,但我还是把它留在这里,因为严格来说,它确实回答了这个问题。您可以为.NET 4.0编写代码,并在.NET 3.5的基础上编写类似的代码 把他的电话线接到你的*.csproj
<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>
未在4上运行
实际上,我的想法和你一样,决定四处搜索,看看是否有其他选择。另请参见
<DefineConstants Condition=" '$(TargetFrameworkVersion)' != 'v4.0' ">NOT_RUNNING_ON_4</DefineConstants>