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

标签 c# types casting ienumerable iequalitycomparer

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

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

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/

相关文章:

sql-server-2008 - SSIS 2008 Execute SQL输出参数映射datetime2问题

casting - 如何将一片无符号整数转换为相同大小的有符号整数?

c# - 如何使用 Linq 过滤 Application.OpenForms 集合?

c# - 在 WPF 应用程序的列表框中列出 Azure blob

c# - 简单 ASP.NET Web API 中的依赖注入(inject)

haskell - 我可以告诉 GHC 任意选择使用哪个实例,因为我不在乎吗?

c++ - 通过引用传递基本数据类型的速度优势 C++

java - 转换是否会在运行时更改声明/引用类型?

c# : Why is a cast needed from an Enum to an INT when used in a switch statement? ,枚举是整数

c# - 在 LINQ 中转换 OrderBy Case 语句