2011-11-01 17 views
7

、組み込みのデリゲートメソッドを持つ.NETでのFuncデリゲートについて教えてくださいなぜ、次のラムダ式は、それに合わせない、のFuncデリゲートについて明確に理解していない:は、.NET 4.0では4.0

// p is a XElement object 
p=>p.Element("firstname").Value.StartsWith("Q") 

答えて

12

Func<T,TResult>は、Tをパラメータとして受け入れ、TResultを返すメソッドを意味します。あなたのラムダは、T=XElementTResult=boolの場合、ラムダはTを返し、TResultを返します。その場合には、それは一般に述語と呼ばれることになる。特に。コンパイラは、(すべてではない)多くのシナリオでの使用に基づいて、汎用型引数(TおよびTResult)を推論できます。

in

outは(コ|コントラ)を参照してください方法の-variance行動 - ないout通常の使用(ここではで-refを意味するものではありませんすなわちout、であることを想定していませんコール時に割り当てられ、終了する前に割り当てる必要があります)。

+0

この文脈では 'method'という単語が機能するように変更すると、私はあなたの答えに同意し、それをupvoteします。 –

+3

@Lajosいいえ、それは**間違っているでしょう**。特にC#には*機能がありません。 'Func 'のようなデリゲートは**メソッド**にバインドされます。 –

+0

さて、どのクラスにも属さない関数を追加できるモジュールを作ることができるので、C#にはメソッドだけでなく関数もあります。私は、モジュール内の関数が述語であることはほとんど確信していますが、テストしませんでした。私はこのコメントの後半部分で間違っているかもしれません。 –

5

Func<T,TResult> TA 2つの一般的なパラメータ:TTResultがあります。あなたが見ることができるように、TargパラメータのタイプであるとTResultしたがって、あなたのコード

// p is a XElement object 
p=>p.Element("firstname").Value.StartsWith("Q") 

だろ有効Func<XElement, bool>、戻り値の型です。

inおよびout一般修飾語は、パラメータが反変または共変であることを意味します。

+1

そして、魔法のトリックは、.NETが[型推論](http://en.wikipedia.org/wiki/Type_inference)を使って 'T'と' TResult'の型を理解することです。したがって、 'p'の型から自動的に' T'を、 'StartsWith(" Q ")'結果の値(boolean)から 'TResult'を自動的に推論します。 –

+0

それはまさに! Marcが指摘したように、 'boolean'を返す代理人は一般に述語と呼ばれます – Connell