在C#6.0中编码而在.NET2.0中编译的缺点

在C#6.0中编码而在.NET2.0中编译的缺点,c#,.net,frameworks,c#-6.0,C#,.net,Frameworks,C# 6.0,今天我突然想到这个问题 C#6.0或任何其他版本都引入了很酷的新功能,使编写代码更容易 但是假设我有一个运行WindowsXP的客户端,它不支持.NET4.6 用C#6.0(或未来最新的C#版本)编写代码,但使用.NET 2.0框架(或与发布时使用的C#版本不同的其他版本的.NET)编译代码,有什么缺点吗 编辑 对于那些不知道的人,您可以通过“项目属性->应用程序选项卡->目标框架”将.NET Framework作为目标 您还可以通过项目属性->构建选项卡->高级->语言版本来定位C语言版本 E

今天我突然想到这个问题

C#6.0或任何其他版本都引入了很酷的新功能,使编写代码更容易

但是假设我有一个运行WindowsXP的客户端,它不支持.NET4.6

用C#6.0(或未来最新的C#版本)编写代码,但使用.NET 2.0框架(或与发布时使用的C#版本不同的其他版本的.NET)编译代码,有什么缺点吗

编辑

对于那些不知道的人,您可以通过“项目属性->应用程序选项卡->目标框架”将.NET Framework作为目标

您还可以通过项目属性->构建选项卡->高级->语言版本来定位C语言版本

EDIT2-C#6.0代码在.NET 2.0上编译并在WindowsXP上运行

static void Main(string[] args)
{
    try
    {
        StringBuilder sb = null;
        string value = sb?.ToString();  // C#6 Feature. Wont throw an exception. 

        if(value == null)
        {
            Console.WriteLine("The Value is null");
        }

        string value2 = sb.ToString();  // Will cause an "Object Reference not set to an instance" exception

    }
    catch ( Exception ex) when (ex.Message.Contains("object")) // C#6.0 conditional catches
    {
        Console.WriteLine("Exception Caught");
    }
    catch(Exception ex)
    {
        Console.WriteLine("Other Exception");
    }

    Console.ReadLine();
}
用C#6.0(或未来最新的C#版本)编写代码,但使用.NET 2.0框架(或与发布时使用的C#版本不同的其他版本的.NET)编译代码,有什么缺点吗

只有以下功能是您无法使用的:

  • LINQ,除非您提供自己的实现
  • 表达式树
  • 扩展方法,除非添加自己的属性
  • FormattableString
    用于插值字符串(次要;仍然可以将插值字符串用作字符串)
  • 动态类型
  • 一般方差
  • 呼叫方信息,除非您添加自己的属性
  • Async/await(不确定为这项非常重要的工作提供自己的实现有多可行)

其他功能,如lambda表达式、表达式体成员、匿名类型等应该可以正常工作。

@Vladimir Not true。许多C#6.0功能都是编译时的,而.Net版本是运行时的。它只影响您可以使用的库。@Vladimir这不是真的。我在我的问题中添加了一些C#6.0代码,这些代码编译并运行在.net2.0上。我很好奇,如何通过创建属性来使用.net2.0编写扩展方法?你能提供一个链接吗?@RenéVogt:基本上,如果你在
System.Runtime.CompilerServices
命名空间中创建自己的
ExtensionAttribute
,编译器将使用它。不过,Windows XP支持.net 4,这将允许你访问一些功能above@EliPerlWindowsXP只是一个例子。问题实际上是针对不同版本的.net framework编译代码。感谢Jon,他不知道是这么简单的编译器魔法阻止了我们在遗留项目中使用扩展(需要继续使用2.0)。现在我只是不确定复制linq扩展的源代码是否合法,或者我们是否必须重新实现它们:)