1

アプリをフレームワークのバージョン 4 からバージョン 4 にダウングレードしたので、この VB.NET ラムダ関数ステートメント (3.5 で動作) を実装したいと考えています。

Dim colLambda As ColumnItemValueAccessor = Function(rowItem As Object) General_ItemValueAccessor(rowItem, colName)

C#で書き直します。これは私の試みでした:

ColumnItemValueAccessor colLambda = (object rowItem) => General_ItemValueAccessor(rowItem, colName);

これを行うと、次のエラーが表示されます。

Error   14  One or more types required to compile a dynamic expression cannot be found. Are you missing references to Microsoft.CSharp.dll and System.Core.dll? C:\Source\DotNet\SqlSmoke\SqlSmoke\UserControls\ScriptUserControl.cs    84  73  SqlSmoke

ただし、アプリをフレームワークのバージョン 4.0 から 3.5 にダウングレードしたとき (ユーザーは 3.5 しか使用せず、4.0 をインストールする権限がないため)。これを行ったとき、「Microsoft.CSharp」への参照が壊れていました。

VB.NET でできたように、C# 3.5 で有効な構文を使用して C# で VB.NET コマンドを書き直すことはできますか? 構文はどうなりますか?

必須の 3.5 にとどまりたい場合は、このコードを VB.NET で記述する必要があると考えています。これは、C# が VB の後にこの機能を取得したように見えるためです。

namespace BinaryComponents.SuperList
{
    public delegate object ColumnItemValueAccessor(object rowItem);
}

private object General_ItemValueAccessor(DataRow rowItem, object colName)
{
    DataRow rowPerson = (DataRow)rowItem;
    return rowPerson[colName.ToString()].ToString();
}
4

3 に答える 3

1

C# の動的型付けは、.Net 4.0 の新機能です。

動的を使用しないでください。

于 2012-08-31T03:37:44.343 に答える
0

問題は、タイプの 1 つが一致しないことです。デリゲート パラメータ タイプを から に変更しobjectますDataRow

public delegate object ColumnItemValueAccessor(DataRow rowItem);

AVD が指摘したように、ラムダ式の構文も修正する必要があります (型は暗示されているobjectためrowItem、そこで指定する必要はありません)。

ColumnItemValueAccessor colLambda = (rowItem) => General_ItemValueAccessor(rowItem, colName);

重要な点は、デリゲート型のラムダ式を記述する場合、ラムダColumnItemValueAccessorのパラメーターと戻り値の型がデリゲートと一致する必要があるということです。

于 2012-08-31T04:18:02.833 に答える
0

使用する権利があることを確認してください

using System.Linq;
于 2012-08-31T03:42:24.387 に答える