为什么将单个元素与IEnumerable进行比较不是编译错误

Nas*_*eer 7 c# ienumerable

var fooRef = new FooRef();
var fooRefEnumerable = Enumerable.Empty<FooRef>();

var fooRefEquality = (fooRef == fooRefEnumerable); //This compiles without any errors

var fooVal = new FooVal();
var fooValEnumerable = Enumerable.Empty<FooVal>();

//Compilation error : Error 1 Operator '==' cannot be applied to operands of type 'FooVal' and 'System.Collections.Generic.IEnumerable<FooVal>'
var fooValEquality = (fooVal == fooValEnumerable); 

public class FooRef { }
public struct FooVal { }   
Run Code Online (Sandbox Code Playgroud)

为什么比较单个对象和对RefTypes有效的IEnumerable?

Jon*_*eet 9

为什么比较单个对象和IEnumerable对RefTypes有效?

因为它将返回完全可行true:

class CunningFooRef : FooRef, IEnumerable<FooRef>
{
    // Implementation...
}

FooRef fooRef = new CunningFooRef();
IEnumerable<FooRef> fooRefEnumerable = Enumerable.Empty<FooRef>();
Console.WriteLine(fooRef == fooRefEnumerable); // False

fooRefEnumerable = (IEnumerable<FooRef>) fooRef;
Console.WriteLine(fooRef == fooRefEnumerable); // True
Run Code Online (Sandbox Code Playgroud)

请注意,这fooRef与fooRefEnumerable您正在使用的编译时类型相同.

如果你封印FooRef,所以编译器知道这是不可能的FooRef引用也为IEnumerable<FooRef>参考,那么你会得到一个编译时错误.