VB.NETでのプロパティの名前を返すことができ、コードのシンプルな作品を考える:式ツリー - C#でのアクション<T>に異なるコンパイラ動作とVB.NET
Function NameForProperty(Of T)(ByVal field As Expression(Of Action(Of T))) As String
Dim expression = DirectCast(field.Body, MemberExpression)
Return expression.Member.Name
End Function
次のように動作します。
をNameForProperty(Of String)(Function (s) s.Length) ' ==> returns "Length"
そして私はC#で同等であったであろうと思ったものを:
string NameForProperty<T>(Expression<Action<T>> field)
{
var expression = (MemberExpression)field.Body;
return expression.Member.Name;
}
Whを私はC#バージョン呼び出そうとエン:
NameForProperty<string>(s=>s.Length);
をこれは、コンパイラエラーを返します。
Only assignment, call, increment, decrement, and new object expressions can be used as a statement
私の質問は:2つのコード片の間の違いは何ですか?
EDIT
イワンコードはC#で動作しない理由としてanswerを提供しました。私はまだそれがVB.NETで動作する理由について興味があります。
EDIT#2
明確にするために、私は動作するコードを探していないよ - 単に理由コードはVB.NETではなくC#で動作します。
私は思っています*「アクション MSDNの記事」(http://msdn.microsoft.com/en-us/library/018hxwa8.aspx)の注釈セクションのコメントの可能性があります。具体的には「Visual Basicでは、Sub ... End Sub構文で定義する必要があります。また、無視される値を返すメソッドでもあります。 Visual Basicのように、戻り値は無視されます。おそらく、前にラムダ式で 'Sub'を使用できなかったことが原因でしょうか?私はしばらくの間、.NETで作業していないので、私はここでは外れているかもしれません。 –
これは正しい手掛かりになります。 C#のアクションには戻り値がありません。戻り値のないvoid関数です。ラムダがVB.NETで返すことができる関数であれば、なぜVBで動作するのでしょうか?それは私の答えに 'Action'の代わりに' Func'を使用していた理由です。 – Zebi