暗黙の文字列演算子を持つ型があります。次のようになります。
public class Foo
{
readonly string _value;
Foo(string value)
{
_value = value;
}
public static implicit operator string(Foo foo)
{
return foo._value;
}
public static implicit operator Foo(string fooAsText)
{
return new Foo(fooAsText);
}
}
暗黙の演算子に渡されたインスタンスがnull
であるというシナリオがありました。明らかに、私たちはで終わったNullReferenceException
。
結局のところ、これは十分に公平だと思いました。結局のところ、nullである型の文字列表現は何であるか(言うのは難しいです)、例外は有効であるように見え、傍受/抑制/処理/無視すべきではありません。私の推論は、誰かが私にnullを与えたという線に沿っていました、なぜ私はnullを返す必要があります。私は他の方法ではこれをしません。私は、「わかっている、変換する前にnullをチェックするだけだ」と思った。
string s = foo == null ? null : foo;
しかし、 nullと比較する前に文字列に変換されているため、これは機能しませんでした。もちろん、この比較は機能します。
Foo f = null;
string s;
if (f != null)
{
s = f;
}
...しかしそれはただ醜いです。
Essential C#5第4版(Safariの「ラフカット」の本)のセクションを読んだところ、次のように書かれています。
暗黙の変換から例外をスローしないでください。
これは、例外をスローしないことを示していますが、例外を抑制すべきかどうか疑問に思います。
最も明白なことは、メソッドにジャンプして次のように変更することです。
public static implicit operator string(Foo foo)
{
return foo == null ? null : foo._value;
}
問題が解決しました。しかし、私は汚い感じがします。nullをチェックすることで、潜在的なバグを隠しているような気がします。私は妄想/アナル/愚かですか?