Visual Studio 2008はLambda Expression Syntaxを認識しません
-
03-07-2019 - |
質問
最近、組み込みの変換ツールを使用して、Webアプリケーションプロジェクト(およびいくつかの依存プロジェクト)を.net 2.0から.net 3.5にアップグレードしました。 MS AJAX 3.5と2.0の外部MS AJAXライブラリを使用するなど、すべてがうまく機能します。
新しいLambda Expression構文を使用しようとしたときに問題が発生します。コンパイラーは、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\
ご協力いただければ幸いです。私は少しの運でGoogleを検索しています
解決
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ではない)を使用していることを確認してください。
他のヒント
VS 2008変換ツールの経験はあまりありませんが、他のプロジェクト変換ツールには「問題」があります。 「壊れた」プロジェクトの.csprojファイルと動作しているプロジェクトを比較することをお勧めします。変換ユーティリティがプロジェクトで何かを壊したのかもしれません。新しいプロジェクトを作成して、すべてのソースファイルをコピーすることもできます。
既存のプロジェクトを参照してジャンプする必要があるフープのカップル、TBH新しいプロジェクトを作成し、既存のソースファイルを新しいプロジェクトに追加する方が簡単であることがわかりました。
ラムダを渡すメソッドへのパラメータを推測していますが、パラメータとしてデリゲートを受け入れますか
これが当てはまる場合、ラムダを特定の種類のデリゲートとしてキャストする必要があります。これは一種の混乱を招きますが、ラムダを常に正しく推論できるとは限らないため、ラムダをキャストするか、メソッドシグネチャを変更して特定の種類のデリゲートを受け入れる必要があることを知っておく必要があります。
これを試してください:
ObjectFactory.Initialize((Action<T>)(x => // where T is the typeof x
{
// ...
}));
また、特定の種類のデリゲート(アクションなど)を受け入れるために、Initializeにいくつかのオーバーロードを作成することもできます。
メソッドが特定のタイプのデリゲートタイプを受け入れる場合、この回答は無視できます:)