gpt4 book ai didi

c# - 为什么我可以将对象与这些对象的 IEnumerable 进行比较,而不是列表?

转载 作者:太空狗 更新时间:2023-10-30 00:17:57 25 4
gpt4 key购买 nike

我刚刚意识到我编写了我认为无效的代码(关于语法),但编译器接受了。

为了简洁起见,我重新创建了一个示例。给定一个类型:

private class MyType
{
}

然后我可以比较 MyType 的一个实例到IEnumerable<MyType> :

var myCollection = new List<MyType> { };
var test = new MyType() == (IEnumerable<MyType>)myCollection;

我很惊讶我可以比较两个不同类型的对象。更有趣的是(至少对我来说有趣),是如果我删除对 IEnumerable 的类型转换。我无法比较它。为什么会这样? List工具 IEnumerable所以假设我缺少某种相等比较器(可能是错误的),为什么这对 List 不可用? ,也是吗?

最佳答案

编译器允许您将对象与接口(interface)进行比较,但不允许您将它们与不相关的具体类进行比较,因为它预先知道精确的类型并且知道这两种类型无法进行比较。允许与接口(interface)进行比较,因为将在运行时尝试从具体对象进行强制转换,这本身就是一个有效的操作。

你究竟要用它做什么是另一回事,事实上你的比较在语义上都不正确。

无论如何,您的代码不会产生真正的比较。运行时将返回 False

var test1 = new MyType() == (IEnumerable<MyType>)myCollection; // False
var test2 = new MyType() == new List<MyType>(); // Compile-time error
var test3 = new MyType() == (IComparable)5; // False

另一个问题是 == 的使用——这在另一个层面上是错误的。您也可以自由调用 Equals,并且似乎是在尝试执行真正具有语义意义的比较。默认实现不会做任何有意义的事情,但同样 - 从编译器的角度来看,一切在语法上仍然是正确的。

关于c# - 为什么我可以将对象与这些对象的 IEnumerable 进行比较,而不是列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49008398/

25 4 0