露出狂

クラス内の、あるメンバをインテリセンスに載せたくない場合、
EditorBrowsableAttributeを使って隠してやることができます。


F#でも


[<EditorBrowsable(EditorBrowsableState.Never)>]
member this.Love() = ()
なんていう風に使えるものだと思っていました。
でもなぜか、僕の愛が相手に見透かされているような気がして、一応確認してみたんです!←
そしたら、普通にインテリセンスに表示されていました。穴があったら埋まりたいです。


早速調べてみると、既知の問題のようでした。
しかし、未だに解決されていないみたい。誰もバグ報告していないのでしょうか。


さらに調べてみると、打開しているようで打開していない、少し打開している打開策を見つけました。

CompilerMessageAttributeを使って、無理やり非表示にする方法です。


[<CompilerMessage("I will give you all my love.", 12345, IsError = false, IsHidden = true)>]
member this.Love() = ()
試してみましたが、確かにインテリセンスには表示されないものの、メンバにアクセスした際に(エラー|警告)が表示されるようになってしまいます(IDE上で波線が表示されるようになる)。
第二引数はメッセージ番号ですが、10000未満の値は予約済みであるため使用できません。


現在、FsAdventJPのネタであるType Provider DSLを作っているのですが(遅くなってごめんなさい)、コンピューテーション・ビルダーのメンバ(Return, Zero, Yield など)を隠蔽しようとしてこの問題に遭遇しました。
結局だめでしたので、すべて露出します。もうこの際どんどん見てください!
ちなみにこのDSL、コードネームは"TypeProviderMagic"です(多分そのまま採用します)。
理由は、実装の大半が黒魔術だからです。数回心が折れそうになりました。

まとめ

Advent Calendarのネタは慎重に選びましょう!!!