You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断结构体默认值?为何KeyValuePair比较代码报错?

解决KeyValuePair默认值比较的CS0019错误

问题原因

KeyValuePair<TKey, TValue>是结构体,.NET默认未为其重载==运算符,因此直接用==和default值比较时会触发CS0019错误。

解决方案

方案1:检查Value是否为null(最简便)

因为Alarm是引用类型,当FirstOrDefault未找到匹配项时,返回的默认KeyValuePair中Value会是null;而找到有效匹配项时,Value必然不为null(集合中的元素应为有效键值对)。代码示例:

KeyValuePair<DateTimeOffset, Alarm> kvpAlarmDuplicate = lastestUniqueAlarms.FirstOrDefault(kvp => kvp.Value.OriginalUniqueMessage == originalUniqueMsg);

if (kvpAlarmDuplicate.Value == null)
{
    // 未找到重复告警,执行对应逻辑
}

方案2:使用EqualityComparer进行通用比较

这是适用于所有类型的通用相等性判断方法,不管TKey/TValue是值类型还是引用类型都能使用:

using System.Collections.Generic;

// ...

KeyValuePair<DateTimeOffset, Alarm> kvpAlarmDuplicate = lastestUniqueAlarms.FirstOrDefault(kvp => kvp.Value.OriginalUniqueMessage == originalUniqueMsg);

if (EqualityComparer<KeyValuePair<DateTimeOffset, Alarm>>.Default.Equals(kvpAlarmDuplicate, default))
{
    // 未找到重复告警,执行对应逻辑
}

方案3:自定义==运算符重载(按需使用)

如果需要频繁进行此类比较,可以为特定的KeyValuePair类型重载==运算符,同时需重写Equals和GetHashCode方法以符合规范:

public static bool operator ==(KeyValuePair<DateTimeOffset, Alarm> left, KeyValuePair<DateTimeOffset, Alarm> right)
{
    return left.Key.Equals(right.Key) && EqualityComparer<Alarm>.Default.Equals(left.Value, right.Value);
}

public static bool operator !=(KeyValuePair<DateTimeOffset, Alarm> left, KeyValuePair<DateTimeOffset, Alarm> right)
{
    return !(left == right);
}

public override bool Equals(object obj)
{
    return obj is KeyValuePair<DateTimeOffset, Alarm> pair && Equals(pair);
}

public bool Equals(KeyValuePair<DateTimeOffset, Alarm> other)
{
    return Key.Equals(other.Key) && EqualityComparer<Alarm>.Default.Equals(Value, other.Value);
}

public override int GetHashCode()
{
    return HashCode.Combine(Key, Value);
}

内容的提问来源于stack exchange,提问作者Eric Ouellet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:33:38