Obsoleteってもしかして相当使える?

 C#の属性であるObsolete属性は、使用したときに警告を出したりコンパイルエラーにしたりできる。

 これは「古い形式のメソッドに警告を出す」のに使うわけだけど、もっと積極的に活用できないだろうか。作業量を減らすために、全interfaceを実装したクラスなんかを作り、

class Hoge : IHoge
{
//...なにやらいろいろ実装する。

  //インターフェースを合わせるために用意してあるが、使用したら例外が飛ぶ。
  public void SomeMethod(){ throw new Exception("not implemented."); }
}

 こういうコーディングになってしまった時に、とりあえず気休めとしてObsoleteを付けとくのはありだろう。

[Obsolete("使用できません",true)]
public void SomeMethod(){ throw new Exception("not implemented."); }

 これで直接使おうとしたらコンパイルエラーになる。しかしinterface越しに使われたらアウトなので大した意味はないか。

 http://d.hatena.ne.jp/haruyutaka/20070111/p1#c

 ここのコメント欄で、Webアプリでユーザーから入力された文字列をそのままSQL文に入れたりすることでSQLインジェクション脆弱性が起こるのにどう対処するか話していて、

query = ”select hoge from fuga where id=” + id.escapeSQL()

html = ”ようこそ” + name.escapeHTML() + ”さん<BR>”

//エラー
query = ”select hoge from fuga where id=” + id

//生文字列をそのまま使う場合。名前を長くして注意を喚起し、使いづらくする。
str = ”あなたが入力した文字列は” + input.toNonEscapeString() + ”です”

 こんな風にしたらいいんじゃないかと思ったのだけど、

query = ”select hoge from fuga where id=” + id;

 これをエラーにするにはC#ではObsoleteを使うしかないように思う。idをUserInputString型として、stringへの暗黙の型変換をエラーとする。

class UserInputString
{
  const string EscapeErrorMsg = 
@"ユーザーから入力された文字列をエスケープせずに使うのは危険です。
生文字列を使用したい場合はToNonEscapeStringを使ってください";

  [Obsolete(EscapeErrorMsg, true)]
  public static implicit operator string(UserInputString uis){
    throw new UncatchException();
  }

  [Obsolete(EscapeErrorMsg,true)]
  public override string ToString()
  {
     //デバッグ用ルーチンかなんかで呼び出されたときのために、とりあえず返しとく。
     return "UserInputString: " + str;
  }

//...
}

 なんかもっと使える例はないもんかな。わからん。