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っていうアドインをいれないといけないらしい。