C#のメソッドのstring引数にnullが設定されたらコンパイルエラーにする方法を考えたなう

public struct NotNull<T>
    where T : class
{
    public class Null { }
    public static implicit operator NotNull<T>(Null other)
    {
        throw new InvalidOperationException();
    }

    public static implicit operator NotNull<T>(T other)
    {
        return new NotNull<T>() { value = other };
    }

    public static implicit operator T(NotNull<T> other)
    {
        return other.value;
    }

    T value;
}

static void f(NotNull<string> notNullText)
{
    // もとにキャストするのがちょっとめんどいけどね
    string text = notNullText;
}

static void Main(string[] args)
{
    f("not null");

    // Compile-Time error
    // f(null);

    // こういう型情報を与えてしまうようなやつは、この方法じゃ無理
    // f((string)null);

    Console.Read();
}

だけどいくつかの弱点がすでにわかってる。
1. エラーメッセージに意図が含まれていない。
2. 型情報を持つ null には効果がない。
3. もとの型にキャストするのがめんどくさい。

あと別の方法としてはC# DbCでできねーかなって考えて
試しに使ってみたけどよくわからんかったわ。
どうやらCodeContractsっていうアドインをいれないといけないらしい。