我们有一个具有隐式字符串运算符的类型。它看起来像这样:
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',比如:
string s = foo == null ? null : foo;
但这不起作用,因为它现在在与 null 比较之前转换为字符串。当然,这种比较会起作用:
Foo f = null;
string s;
if (f != null)
{
s = f;
}
......但这很丑陋。
我阅读了Essential C# 5 第 4 版中的部分(关于 Safari 的“Rough Cuts”书),它说:
不要从隐式转换中抛出异常。
这说不要抛出异常,但这让我想知道我应该抑制异常吗?
最明显的做法是跳入方法并将其更改为:
public static implicit operator string(Foo foo)
{
return foo == null ? null : foo._value;
}
问题解决了。但是我觉得很脏。我觉得我通过检查 null 来隐藏一个潜在的错误。我是偏执狂/肛门/愚蠢吗?