问题描述
我有一个方法可以通过键从字典中检索一个值,或者如果没有找到则返回一个默认值
public static TValue GetValueOrDefault<TKey,TValue>(this IDictionary<TKey,TValue> dict,TKey key,TValue defaultValue)
{
if (dict.TryGetValue(key,out TValue existingValue))
{
return existingValue;
}
else
{
return defaultValue;
}
}
在泛型方法中使用时,默认值设置为default(T)
,因为它可以是值或引用类型
T myGenericVar = myDict.GetValueOrDefault(key,default(T));
现在我想比较这个 var 以了解该值是否在字典中找到,但不能使用运算符 ==
,因为编译器不知道它是值还是引用类型。所以我用了 Equals
bool found = myGenericVar.Equals(default(T))
如果 T
是引用类型,那么 default(T)
实际上是 null
并且在 null 上调用 Equals
会产生 NullReferenceException
如何避免异常?
解决方法
正如评论中所暗示的,如果您想知道是否返回默认值,请创建另一个方法TryGetValueOrDefault
:
public static bool TryGetValueOrDefault<TKey,TValue>(this IDictionary<TKey,TValue> dict,TKey key,TValue defaultValue,out TValue value)
{
if (dict.TryGetValue(key,out TValue existingValue))
{
value = existingValue
return true;
}
else
{
value = defaultValue;
return false
}
}