相关疑难解决方法(0)

条件编译和框架目标

如果目标框架是较新版本,那么我的项目代码可能会有一些小的地方可以大大改进.我希望能够更好地利用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# msbuild .net-4.0 .net-3.5

121
推荐指数
4
解决办法
5万
查看次数

如何设置条件编译变量?

在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#中是可能的.我想知道的是,我如何在项目级别定义常量,以便我可以输入逻辑,如果我定义常量的一个方法或另一个代码块,我将允许我条件编译一个代码块如果我不这样定义?我假设它已经在项目的属性中的某个地方完成,但我如何定义它?

c#

41
推荐指数
3
解决办法
6万
查看次数

什么.NET版本可供选择?

我正在为我们的在线REST服务编写公共.NET类库版本,我无法决定选择哪个版本的.NET.

我想使用.NET 4.0版本,但这样的编译类库不能在.NET 2.0版本中使用?

也许有统计数据有多少开发人员使用.Net 2.0版本?

.net c# .net-4.0 .net-3.5 .net-2.0

9
推荐指数
3
解决办法
3592
查看次数

为什么采用IEnumerable <interface>的函数不接受IEnumerable <class>?

比方说,我有一个班级:

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.一个平凡的现实世界的例子是生产汽车列表,然后被告知它不是车辆列表.

这只是一个小小的烦恼,但如果有人能够对此有所了解,我会非常感激.

generics ienumerable inheritance covariance c#-3.0

5
推荐指数
1
解决办法
573
查看次数