如果目标框架是较新版本,那么我的项目代码可能会有一些小的地方可以大大改进.我希望能够更好地利用C#中的条件编译来根据需要切换它们.
就像是:
#if NET40
using FooXX = Foo40;
#elif NET35
using FooXX = Foo35;
#else NET20
using FooXX = Foo20;
#endif
Run Code Online (Sandbox Code Playgroud)
这些符号中的任何一个都是免费的吗?我是否需要将这些符号作为项目配置的一部分注入?看起来很容易,因为我知道哪个框架是MSBuild的目标.
/p:DefineConstants="NET40"
Run Code Online (Sandbox Code Playgroud)
更新:我的问题是人们如何处理这种情况?你在创造不同的配置吗?您是否通过命令行传递常量?
在C/C++中,您可以在代码中定义宏,如下所示:
#define OLD_WAY 1
Run Code Online (Sandbox Code Playgroud)
虽然我从来没有这样做过,但我认为C#中可以使用同样的东西.更重要的是,在C/C++中,可以通过执行以下操作来执行某些条件编译逻辑:
#if OLD_WAY == 1
int i = 0;
#else
int i = 1;
#endif
Run Code Online (Sandbox Code Playgroud)
好的,所以这一切都很酷.而且,我认为这种逻辑在C#中是可能的.我想知道的是,我如何在项目级别定义常量,以便我可以输入逻辑,如果我定义常量的一个方法或另一个代码块,我将允许我条件编译一个代码块如果我不这样定义?我假设它已经在项目的属性中的某个地方完成,但我如何定义它?
我正在为我们的在线REST服务编写公共.NET类库版本,我无法决定选择哪个版本的.NET.
我想使用.NET 4.0版本,但这样的编译类库不能在.NET 2.0版本中使用?
也许有统计数据有多少开发人员使用.Net 2.0版本?
比方说,我有一个班级:
public class MyFoo : IMyBar
{
...
}
Run Code Online (Sandbox Code Playgroud)
然后,我想使用以下代码:
List<MyFoo> classList = new List<MyFoo>();
classList.Add(new MyFoo(1));
classList.Add(new MyFoo(2));
classList.Add(new MyFoo(3));
List<IMyBar> interfaceList = new List<IMyBar>(classList);
Run Code Online (Sandbox Code Playgroud)
但这会产生错误:
`Argument '1': cannot convert from 'IEnumerable<MyFoo>' to 'IEnumerable<IMyBar>'
Run Code Online (Sandbox Code Playgroud)
为什么是这样?由于MyFoo实现了IMyBar,人们可以预期IEnumerable的MyFoo可以被视为IMyBar的IEnumerable.一个平凡的现实世界的例子是生产汽车列表,然后被告知它不是车辆列表.
这只是一个小小的烦恼,但如果有人能够对此有所了解,我会非常感激.
c# ×3
.net-3.5 ×2
.net-4.0 ×2
.net ×1
.net-2.0 ×1
c#-3.0 ×1
covariance ×1
generics ×1
ienumerable ×1
inheritance ×1
msbuild ×1