【问题标题】:Visual Studio 2008 doesn't recognize Lambda Expression SyntaxVisual Studio 2008 无法识别 Lambda 表达式语法
【发布时间】:2010-09-28 23:23:24
【问题描述】:

我最近使用内置的转换工具将 Web 应用程序项目(以及一些依赖项目)从 .net 2.0 升级到了 .net 3.5。一切都运行良好,例如使用 MS AJAX 3.5 与 2.0 中的外部 MS AJAX 库。

我在尝试使用新的 Lambda 表达式语法时出现问题。编译器不会将 Lambda 表达式识别为有效语法。解决方案中所有项目的目标框架版本都设置为 3.5。我还能够在同一解决方案的库项目中成功使用 Lambda 表达式。

这是给我错误的代码。没什么特别的。

ObjectFactory.Initialize(x => 
        {
            x.ForRequestedType<IUnitIdSequencingService>().TheDefaultIsConcreteType<UnitIdSequencingService>();
            x.ForRequestedType<IGadgetDAO>().TheDefault.Is.OfConcreteType<GadgetDAO>().WithCtorArg("instance").EqualToAppSetting("OSHAInspectionManager");

        });

我得到的具体错误是:

Error   102 Invalid expression term '>' D:\projects\bohlco\pmr\PMR\Web\App_Code\Bootstrapper.cs 13  41  D:\...\Web\

任何帮助将不胜感激。我一直在搜索谷歌,运气不佳

【问题讨论】:

  • 以下函数是否编译?私有 void v() { Func f = x => x; f(1); }

标签: c# asp.net visual-studio-2008 .net-3.5 lambda


【解决方案1】:

如果任何页面正在由 ASP.NET 编译(即您没有预编译 WAP),那么您需要确保 ASP.NET 知道 C# 3.0 (.NET 3.5) 编译器.确保 web.config 中包含以下内容:

<system.codedom>
   <compilers>
      <compiler language="c#;cs;csharp"
            extension=".cs"
            warningLevel="4"
            type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=
         <providerOption name="CompilerVersion" value="v3.5"/>
         <providerOption name="WarnAsError" value="false"/>
      </compiler>
   </compliers>
</system.codedom>

此外,如果您在 IIS 中托管,请确保将正确的文件夹设置为应用程序,并且它使用的是 ASP.NET v2.blah(不是 v1.1.blah)。

【讨论】:

  • 谢谢!我感觉问题出在编译器选项上。我在 Visual Studio 周围看了一圈,并没有真正看到任何有用的东西。
【解决方案2】:

我猜你将 lambda 传递给的方法的参数接受一个委托作为参数?

如果这是真的,那么您需要将 lambda 转换为特定类型的委托。这有点令人困惑,但您需要知道的是,无法始终正确推断出 lambda,因此您需要对其进行强制转换或更改方法签名以接受特定类型的委托。

试试这个:

ObjectFactory.Initialize((Action<T>)(x => // where T is the typeof x
{
    // ...
}));

您也可以尝试为 Initialize 进行一些重载以接受特定类型的委托(例如 Action)。

如果您的方法确实接受特定类型的委托类型,则可以忽略此答案:)

【讨论】:

  • 对于这种情况,使用 Initialize((T x) => { ... });会更清楚。此外,编译器错误消息会有所不同。
【解决方案3】:

你需要跳过现有项目重新引用的几个箍,TBH 我发现创建一个新项目并将我现有的源文件添加到新项目中更容易。

【讨论】:

    【解决方案4】:

    我对 VS 2008 转换工具没有太多经验,但我知道其他项目转换工具也有“问题”。我建议您将“损坏”项目的 .csproj 文件与正在运行的项目进行比较。也许转换实用程序破坏了您项目中的某些内容。您也可以尝试创建一个新项目并复制所有源文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多