主题
IGameLink 比较
两个变量的编译时类型都是 IGameLink 接口时,== / != 比较引用,不能用来判断它们是否指向同一条数据。
错误写法与修正
csharp
// left 和 right 均为 IGameLink 类型,且已知不为 null。
// 错误:left == right
bool sameData = left.Equals(right);
// 允许 null 时,先处理左侧空值,再调用接口的数据相等性比较。
bool sameOrBothNull = nullableLeft is null
? nullableRight is null
: nullableLeft.Equals(nullableRight);判断是否为空用 link is null / link is not null,不需要做数据相等性比较。
为什么具体类型可能表现不同
GameLink<TCategory, V> 提供了与 Link 接口比较的运算符重载。编译器能选中该重载时,== 会调用数据相等性逻辑;转成两个接口变量后,这个重载就不再参与绑定。
因此,不要根据某处具体类型的 == 能工作,就推断所有 .Link == ... 都具有相同语义。检查比较两端的编译时类型;接口数据相等性使用 .Equals()。
编译诊断
| 诊断 | 含义 |
|---|---|
IGAMELINK001 | 两个 Link 接口使用 ==,应检查是否需要数据相等比较 |
IGAMELINK002 | 两个 Link 接口使用 !=,应检查是否需要数据不等比较 |
这些诊断针对接口之间的比较,不要求改写已经绑定具体类型运算符的代码。数据定义与 Link 的关系见 GameData 系统。