恐怖のおやすみエラー

F# Advent Calender 2015の2日目の記事を拝見していました。
同名の型などを定義することによって、既存の型の使用を制限する方法が紹介されていました。


ふと、
「そういえば、CompileMessage属性なんてものがあったなぁ」
と思い出したので、別パターンを書いてみました。
以下のようにすると、(1)XmlDocumentクラスがインテリセンスに表示されなくなり、(2)それでも自力でインスタンスを生成しようとするとコンパイルエラーが発生するようになります。*1



namespace System.Xml

module private AA =
[<Literal>]
let oyasumi = """
_____

 (^o^)ノ < おやすみー
\⌒⌒⌒ \

\|⌒⌒⌒⌒|
 ̄ ̄ ̄ ̄ ̄
"""

// インテリセンスに表示させないための属性
[<CompilerMessage("隠蔽のための属性", 12345, IsHidden = true)>]
type XmlDocument =
// コンストラクタにアクセスした時にエラーを発生させる
[<CompilerMessage(AA.oyasumi, 12345, IsError = true)>]
new() = {}


スクリーンショット


おしまい。

*1:IsErrorプロパティをfalseにすることによって、エラーを警告にすることも可能