我有一个方法按键从字典中检索值,如果没有找到则返回默认值
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));
现在我想比较这个变量,以便了解该值是否在字典中找到,但是由于编译器不知道它是值类型还是引用类型,因此不能使用操作符==
。所以我用了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
}
}