gpt4 book ai didi

c# - 当一个操作数是接口(interface)时,回退到 Object 的 == 运算符的原因是什么?

转载 作者:可可西里 更新时间:2023-11-01 09:07:26 28 4
gpt4 key购买 nike

考虑以下类型:

class A { }
class B { }
interface IC { }

A a = null; // the value doesn't matter - null or anything else, for all three
B b = null;
IC c = null;

以下does not compile :

var x = a == b;

但是以下确实编译(正如我惊讶地发现的那样):

var x = a == c;

据我所知,编译器回退到使用默认的 == 运算符,它是在对象上定义的,因此接受任何类型的参数。 IL 看起来像这样(忽略 ldfld 的细节):

ldarg.0
ldfld class A a
ldarg.0
ldfld class IC c
ceq
stloc.0

换句话说,它使用引用相等性。

我的问题:

  1. 在语言设计方面,为什么这有意义?对我来说不是,我认为这是一个很大的陷阱。

  2. 如果这确实是一个陷阱,难道代码分析不应该警告我们吗? (不 - 它没有)。顺便说一下,ReSharper seems to have this feature .

最佳答案

第二行编译通过的原因是可能还有一个类派生自A,实现了IC。

public class D : A, IC {}
...
a = new D(); c = a; var t = a == c; //t = true;

类只能从一个类继承,因此您永远不能创建同时从 A 和 B 继承的类,除非 A 是 B 的后代,反之亦然。

关于c# - 当一个操作数是接口(interface)时,回退到 Object 的 == 运算符的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14697161/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com