我创建了一个示例项目,以C#6.0 goodies-null传播和属性初始化为例,设置目标版本.NET 4.0和它...作品

public class Cat
{
    public int TailLength { get; set; } = 4;

    public Cat Friend { get; set; }

    public string Mew() { return "Mew!"; }
}

class Program
{
    static void Main(string[] args)
    {
        var cat = new Cat {Friend = new Cat()};
        Console.WriteLine(cat?.Friend.Mew());
        Console.WriteLine(cat?.Friend?.Friend?.Mew() ?? "Null");
        Console.WriteLine(cat?.Friend?.Friend?.TailLength ?? 0);
    }
}

这是否意味着我可以在面向.NET4.0的软件中使用C#6.0功能?有什么限制或缺点吗?

推荐答案

是的(大部分).C#6.0需要新的Roslyn编译器,但新编译器可以针对较旧的框架版本进行编译.这仅限于don't require support from the framework个新功能.

例如,虽然可以在C#6.0的早期版本中使用字符串插值功能.Net(因为它会导致呼叫string.Format):

int i = 3;
string s = $"{i}";

您需要.Net 4.6才能将其与IFormattable一起使用,因为只有新的框架版本添加了System.FormattableString:

int i = 3;
IFormattable s = $"{i}";

您提到的情况不需要框架中的类型即可工作.因此,编译器完全能够支持旧框架版本的这些功能.

.net相关问答推荐

如何在AutoMapper中添加自定义方法到项目中?

从窗体中移除另一个控件中引用的控件时获取设计时通知

Ubuntu 22.04 + JetBrains Rider 不能做脚手架 dbContext

如何在 .Net Core EF 中组合多个条件表达式来过滤数据?

在 WP7 中将 List 转换为 ObservableCollection

比较 C# 中的字符串和对象

有没有办法以编程方式最小化窗口

通用枚举到int的C#非装箱转换?

Automapper:使用 ReverseMap() 和 ForMember() 进行双向映射

为什么递归调用会导致不同堆栈深度的 StackOverflow?

为什么需要 XmlNamespaceManager?

将 Topshelf 应用程序安装为 Windows 服务

有没有办法只在 C# 中设置一次属性

如何将 System.Type 转换为其可为空的版本?

为什么有些对象属性是 UnaryExpression 而有些是 MemberExpression?

String.Replace() 与 StringBuilder.Replace()

为什么发布和调试模式下的代码行为不同?

您可以使用 Xamarin 开发 Linux 应用程序吗?

SqlBulkCopy 的推荐批量大小是多少?

SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有什么区别?