【发布时间】:2014-03-17 12:53:52
【问题描述】:
假设我有通用值包装器:
class Wrapper<T>
{
public T Value { get; set; }
}
我想按照下面列出的方式使用它(或类似的东西):
var wrapper = new Wrapper<Target>();
// ...
Target target = wrapper;
如何使用隐式运算符、扩展方法或其他方法来提供单一位置空值检查?作为好处之一,我想将以下代码保留在一个地方:
if (wrapper != null)
{
return wrapper.Value;
}
return default(T);
编辑:
我试过运算符:
public static implicit operator T(Wrapper<T> wrapper)
{
return wrapper.Value ? default(T) : wrapper.Value;
}
下面的方法非常有效:
var wrapper = new Wrapper<long>();
long value = wrapper;
但失败了:
var wrapper = new Wrapper<IEnumerable<long>>();
IEnumerable<long> value = wrapper;
编译器说无法从Wrapper<IEnumerable<long>> 转换为IEnumerable<long>。有什么想法吗?
【问题讨论】:
-
T会在这里做什么?任何事物?仅不可为空的值类型(又名where T:struct)?还是...? -
任何东西。是否有针对不同约束的多种不同解决方案?
-
对于不可为空的值类型,只有包装器可以为空;对于引用类型,包装器及其值都可以为空。所以你要么有一张或两张支票。
-
无需查看
Value。如果是== default(T),那么可以让它返回。这里没有问题。 -
@SergeyMetlov:糟糕,我忘了。不幸的是,据我了解,您无法在接口上执行用户定义的转换:stackoverflow.com/a/4280626/1269654(例如,如果您将其从
IEnumerable<long>更改为List<long>,则转换将起作用。)编辑:错误消息很漂亮坏的。如果您将其更改为 justIEnumerable(没有通用参数),它会说:“不允许用户定义的与接口之间的转换”
标签: c#