C#的正确版本号是什么?什么时候出来的?为什么我找不到有关C#3.5的任何答案?

这个问题主要是为了帮助那些使用错误版本号(例如C#3.5)搜索答案的人。希望任何没有找到错误版本号答案的人都能找到这个问题,然后用正确的版本号再次搜索。


当前回答

预览:C#11.0.NET Core 7.0 Visual Studio 2022更新1

阅读更多信息

允许在插值字符串的“孔”中使用换行符列出模式参数空值检查与可为空的引用类型的交互泛型属性字段关键字接口中的静态摘要或模式下的声明记录和初始化受歧视的工会T的参数范围语句作为表达式表达式树类型系统扩展

其他回答

C#1.0-Visual Studio.NET 2002

类别结构体接口事件财产代表表达声明属性直接常量

C#1.2-Visual Studio.NET 2003

在foreach中处理foreach over字符串专用化C#-Visual Studio 2005泛型分部工程类型匿名方法遍历器可为空的类型Getter/setter单独可访问性方法组转换(委托)静态类委托推断

C#3-Visual Studio 2008

隐式类型的局部变量对象和集合初始化器自动实现的财产匿名类型扩展方法查询表达式Lambda表达式表达式树分部法

C#4-Visual Studio 2010

动态绑定命名参数和可选参数通用委托和接口的协差和反差嵌入式互操作类型(“NoPIA”)

C#5-Visual Studio 2012

异步方法呼叫者信息属性

C#6-Visual Studio 2015

在线起草规范编译器即服务(Roslyn)将静态类型成员导入命名空间异常筛选器等待捕获/最终块自动属性初始化器仅用于getter的财产的默认值表达式体成员空传播器(空条件运算符,简洁的空检查)字符串插值操作员姓名字典初始值设定项

C#7.0-Visual Studio 2017

输出变量图案匹配多元组解构丢弃本地函数二进制字面值数字分隔符Ref返回和本地通用异步返回类型更多表情丰富的成员抛出表达式

C#7.1-Visual Studio 2017版本15.3

异步主默认表达式引用程序集推断的元组元素名称与泛型匹配的模式

C#7.2-Visual Studio 2017版本15.5

Span和ref类类型在参数和只读引用中Ref条件非尾随命名参数受私人保护的可访问性基数说明符后的数字分隔符

C#7.3-Visual Studio 2017版本15.7

System.Enum、System.Delegate和非托管约束。Ref-local重新赋值:现在可以使用Ref赋值运算符(=Ref)重新赋值Ref-locals和Ref参数。Stacklalloc初始化器:现在可以初始化堆栈分配的数组,例如Span x=Stackalloc[]{1,2,3};。索引可移动固定缓冲区:固定缓冲区可以索引到,而无需首先固定。自定义固定语句:可以在固定语句中使用实现适当GetPinnableReference的类型。改进的过载候选:可以尽早排除一些过载解决候选,从而减少歧义。初始化器和查询中的表达式变量:字段初始化器、构造函数初始化器和LINQ查询中允许使用表达式变量,如out var和pattern变量。元组比较:元组现在可以与==和!=进行比较。支持字段上的属性:允许自动实现的属性上的[field:…]属性以其支持字段为目标。

C#8.0-.NET Core 3.0和Visual Studio 2019 16.3版

可为null的引用类型:使用?,notnull约束和注释属性,编译器将使用这些属性来尝试和检测可能的null值被取消引用或传递给不合适的API。默认接口成员:接口现在可以具有具有默认实现的成员,以及静态/私有/受保护/内部成员(状态除外)(即无字段)。递归模式:位置和属性模式允许更深入地测试对象,开关表达式允许测试多个模式并以紧凑的方式生成相应的结果。异步流:await foreach和await using允许异步枚举和处理IAsyncEnumerable集合和IAsyncDisposable资源,异步迭代器方法允许方便地实现此类异步流。增强的using:using声明添加了隐式作用域,using语句和声明允许使用模式处理ref结构。范围和索引:i..j语法允许构造System.Range实例,^k语法允许构造System.Index实例,这些实例可用于索引/切片集合。空合并赋值:??=允许在值为空时有条件地赋值。静态局部函数:用Static修改的局部函数无法捕获此变量或局部变量,而局部函数参数现在会在父范围中隐藏局部变量。非托管泛型结构:只有非托管字段的泛型结构类型现在被视为非托管(即,它们满足非托管约束)。只读成员:现在可以将单个成员标记为只读,以指示和强制它们不修改实例状态。嵌套上下文中的Stacklalloc:现在在更多的表达式上下文中允许使用Stackalloc表达式。可选的插值逐字字符串:@$“…”字符串被识别为插值逐字字符串,就像$@“…”一样。属性访问器过时:属性访问器现在可以单独标记为过时。对于无约束类型参数,Permit为空

[来源]:https://github.com/dotnet/csharplang/blob/master/Language-Version-History.md

Visual Studio.NET中的C#1.0Visual Studio 2005中的C#2.0Visual Studio 2008中的C#3.0Visual Studio 2010中的C#4.0C#5.0与Visual Studio 2012Visual Studio 2015中的C#6.0C#7.0与Visual Studio 2017C#8.0与Visual Studio 2019C#9.0与Visual Studio 2019

您可以在此处查看最新的C#版本

处理C#版本号时最大的问题是,它没有绑定到.NET Framework版本,这似乎是由于Visual Studio和.NET Framework之间的同步发布。

C#的版本实际上绑定到编译器,而不是框架。例如,在Visual Studio 2008中,您可以编写C#3.0,并以.NET Framework 2.0、3.0和3.5为目标。C#3.0命名法描述代码语法和支持功能的版本,与ANSI C89、C90和C99描述C的代码语法和功能的方式相同。

看看Mono,你会发现Mono 2.0(大部分是从ECMA规范中实现的.NET Framework 2.0版本)支持C#3.0语法和特性。

比较MSDN文章“C#2.0语言和编译器中的新增功能”和“Visual C#2005中的新增”,可以推断出“C#major_version.minor_version”是根据编译器的版本编号创建的。

有与.NET 1.1和VS 2003相对应的C#1.2,也称为Visual C#.NET 2003。

但在进一步的研究中,微软停止了增加次要版本(在点之后)的数字,或者让它们不是零,0。尽管应该注意,与.NET 3.5对应的C#在msdn.microsoft.com中被命名为“Visual C#2008 Service Pack 1”。

有两种并行命名:按.NET/编译器主要版本编号和Visual Studio编号。

C#2.0是Visual C#2005的同义词

C#3.0对应(或者更准确地说,可以针对):

.NET 2.0<==>Visual C#2005.NET 3.0<==>Visual C#2008.NET 3.5<==>Visual C#2008 Service Pack 1