假设我有一个通用值包装器:
class Wrapper<T>
{
public T Value { get; set; }
}
我想使用它如下所列(或类似这样):
var wrapper = new Wrapper<Target>();
// ...
Target target = wrapper;
如何使用隐式操作符,扩展方法或其他方法来提供单位置null检查?作为好处之一,我希望将以下代码保留在一个地方:
if (wrapper != null)
{
return wrapper.Value;
}
return default(T);
编辑:I tried the operator:
public static implicit operator T(Wrapper<T> wrapper)
{
return wrapper.Value ? default(T) : wrapper.Value;
}
这是完美的工作在下面的方式:
var wrapper = new Wrapper<long>();
long value = wrapper;
But fails on:
var wrapper = new Wrapper<IEnumerable<long>>();
IEnumerable<long> value = wrapper;
编译器说不可能从Wrapper<IEnumerable<long>>
转换到IEnumerable<long>
。什么好主意吗?
可以使用隐式操作符:
public static implicit operator T(Wrapper<T> value)
{
return value == null ? default(T) : value.Value;
}
编辑:
正如@ChrisSinclair所指出的,当T是接口时,这不起作用,a能想到的唯一解决方案是使用扩展方法,如:
public static T SafeGetValue<T>(this Wrapper<T> value)
{
return value == null ? default(T) : value.Value;
}
然后:
IEnumerable<long> value = wrapper.SafeGetValue();
return wrapper.Value ?? default(T);
可以在通用包装器本身中进行空值检查,如下所示。
class Wrapper<T>
{
private T _value;
public T Value
{
get
{
return _value ?? default(T);
}
set
{
_value = value;
};
}
}