4 c# ienumerable types casting iequalitycomparer
我刚刚意识到我编写了我希望无效的代码(关于语法),但编译器接受了.
为了简洁起见,我重新创建了一个例子.给定类型:
private class MyType
{
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以比较的一个实例MyType到IEnumerable<MyType>:
var myCollection = new List<MyType> { };
var test = new MyType() == (IEnumerable<MyType>)myCollection;
Run Code Online (Sandbox Code Playgroud)
我很惊讶我能比较两种不同类型的物体.更有意思(至少对我有趣),如果我删除了演员,IEnumerable我无法比较它.为什么会这样?一个List工具,IEnumerable所以假设某种平等比较器在某个地方,我缺少(可能是错误的),为什么这也不可用List?
编译器允许您将对象与接口进行比较,但它不允许您将它们与不相关的具体类进行比较,因为它预先知道精确类型并且知道无法比较这两种类型.允许与接口进行比较,因为将在运行时尝试来自具体对象的强制转换,这本身就是一个有效的操作.
你究竟打算用它做什么是一个不同的故事,事实上你的比较中没有一个在语义上是正确的.
在任何情况下,您的代码都不会产生真正的比较.它将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
Run Code Online (Sandbox Code Playgroud)
另一个问题是使用==- 在另一个层面上是错误的.您也可以自由地调用Equals,并且似乎尝试执行真正的语义上有意义的比较.默认实现不会做任何有意义的事情,但是再次 - 从编译器的角度来看,一切都在语法上是正确的.