作爲示例,使用String類的Join()方法。當你在 上調用一個字節數組時,例如C#編譯器硬編碼IEnumerable的特殊處理?
byte[] bytes = {3,4,5};
string str = string.Join(",", bytes);
C#編譯器的地圖加入到這個簽名
public static String Join<T>(String separator, IEnumerable<T> values);
然而,字節[]派生隱式地從類Array不從一般的IEnumerable獲得,而是從非通用IEnumerable的派生,即
public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable {...}
如果我做我自己的接口和類,類似這種情況下,同樣的,我會得到 一個編譯器錯誤預期因爲... e根據規則,您不能將從接口IA(非泛型IEnumerable)派生的類 轉換爲從IA派生的接口IB(通用IEnumerable) 。這意味着C#編譯器只是簡單地對特定名稱IEnumerable進行硬編碼。 這解釋了什麼?
沒有IEnumerable的特殊加工,但有陣協方差的特殊處理。 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/arrays#array-covariance –
'byte []'實際上實現了'IEnumerable'(更具體地說,[它實現'IList '](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/arrays#arrays-and-the-generic-ilist-interface))。魔術不在'IEnumerable'中,而是以數組的方式處理。查看'Array'的元數據不會告訴你任何事情。 –
@ScottChamberlain這裏沒有數組協變。 – Servy