<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
这个标签有个至关重要的作用,那就是告诉.Net Framework该用哪个版本的编译器来编译代码。
其中的子标签
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
是设置C#语言该用什么版本的编译器来编译,可以看到里面的属性name="CompilerVersion"
和value="v3.5"
指定了编译器版本是3.5的(不信你把这里改成2.0,在代码中使用简化属性时又会报错了)。
另外个子标签
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
是设置VB语言该用什么版本的编译器来编译,可以看到也是3.5。
如果web.config中没有<system.codedom>
标签的配置,那么.Net Framework 默认使用的是2.0版本的编译器,2.0的编译器当然不能识别诸如简化属性、匿名类等这些3.5才有的语法,所以编译时会报错。这都是因为.Net Framework 3.5是.Net Framework 2.0的扩展版本,不信你可以到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG
下查看machine.config
和web.config
等根配置文件,你会发现其中几乎没有对.Net Framework 3.5的相关特性进行配置,里面的配置大部分还是针对2.0版本的,这是因为.Net 3.5的很多相关特性是在项目中的web.config中扩展的。这一点已在.Net Framework 4.0中得到了改进,因为.Net Framework 4.0并不是旧版本的扩展版本,其大部分相关特性都在根配置文件中配置好了,不需要在项目配置文件中进行配置。