Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以使预处理器指令依赖于.NET framework版本吗?_C#_.net_Frameworks_C Preprocessor_Preprocessor Directive - Fatal编程技术网

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.0
string.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>