質問
情報を読んだだけです このページ, 、そして新しいですか?オペレーターが言及されていますが、その使用法がどうなるかはまったく不明です。
誰でも簡単な説明を提供し、このオペレーターがどのように使用されるかについてのコードを投稿して、おそらくユースケースに言及してもらえますか?
編集: :これは本当に厄介です、私はそれに気づいたのですか?オペレーターは、Donのリリースノートではもはや言及されていません。なぜそれがなぜですか?
解決
このf#リリースには(?)と(?< - )には、2つの新しい「特別な」演算子があります。それらは定義されていませんが、過負荷に使用できるため、自分で定義できます。特別なビットは、彼らが2番目のオペランドをどのように扱うかです。彼らはそれを有効なf#識別子であることを要求しますが、それを渡して、オペレーターを文字列として実装する機能です。言い換えると:
a?b
脱着しています:
(?) a "b"
と:
a?b <- c
脱着しています:
(?<-) a "b" c
これらのオペレーターの非常に単純な定義は次のとおりです。
let inline (?) (obj: 'a) (propName: string) : 'b =
let propInfo = typeof<'a>.GetProperty(propName)
propInfo.GetValue(obj, null) :?> 'b
let inline (?<-) (obj: 'a) (propName: string) (value: 'b) =
let propInfo = typeof<'a>.GetProperty(propName)
propInfo.SetValue(obj, value, null)
Gettorの返品タイプは一般的であるため、ほとんどの場合、使用するサイトで指定する必要があることに注意してください。
let name = foo?Name : string
あなたはまだチェーンコール(?)ができますが((?)の最初の引数はジェネリックであるため):
let len = foo?Name?Length : int
もう1つのより興味深い実装は、VBが提供するCallByNameメソッドを再利用することです。
open Microsoft.VisualBasic
let inline (?) (obj: 'a) (propName: string) : 'b =
Interaction.CallByName(obj, propName, CallType.Get, null) :?> 'b //'
let inline (?<-) (obj: 'a) (propName: string) (value: 'b) =
Interaction.CallByName(obj, propName, CallType.Set, [| (value :> obj) |])
|> ignore
その利点は、プロパティとフィールドの両方を正しく処理し、Idispatch comオブジェクトなどで動作することです。
他のヒント
「?」のように聞こえますオペレーターは、動的言語ランタイム(DLR)に関連しています。つまり、コンパイル時間ではなく、実行時にオブジェクトメンバー(メソッド、プロパティ)にバインドする場合に使用します。
これがC#でも動的なメンバーの呼び出しがどのように機能するかを望んでいたので、それは面白いです。残念ながら、C#は「擬似」タイプ(「動的」IIRC)を介してこの機能を公開します。私の意見では、これにより、コードがやや明確になりません(変数宣言を追跡して、通話が早期に縛られているか遅いかを知る必要があるため)。
正確な構文はわかりませんが、推測する必要がある場合は、「」を置き換えるか補強します。 (DOT)オペレーター。のように:
let x = foo?Bar()
または多分:
let x = foo.?Bar()
モジュールがあります fsharp.interop.dynamic, 、DLRを使用して動的演算子を実装するNugetで。
let ex1 = ExpandoObject() in
ex1?Test<-"Hi";
ex1?Test |> should equal "Hi";