作为示例,使用String类中的Join()方法.当你在字节数组上调用它时,例如
byte[] bytes = {3,4,5};
string str = string.Join(",", bytes);
Run Code Online (Sandbox Code Playgroud)
C#编译器映射加入此签名
public static String Join<T>(String separator, IEnumerable<T> values);
Run Code Online (Sandbox Code Playgroud)
但是,byte []从类Array中隐式派生,它不是从通用的IEnumerable派生的,而是派生自非通用的IEnumerable,即
public abstract class Array : ICloneable, IList, ICollection, IEnumerable, IStructuralComparable, IStructuralEquatable {...}
Run Code Online (Sandbox Code Playgroud)
如果我对我自己的类似于这种情况的接口和类做同样的事情,我将得到预期的编译器错误,因为根据规则,你不能将从接口IA(非通用IEnumerable)派生的类转换为接口IB(来自IA的通用IEnumerable).这意味着C#编译器只需对特定名称IEnumerable进行硬编码.这在哪里解释?
我想知道为什么关键词"in"和"out"甚至在泛型代表中使用,例如
public delegate TResult Func1<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
public delegate TResult Func2<in T1, TResult, T2>(T1 arg1, T2 arg2);
public delegate TResult Func3<TResult, T2, T1>(T1 arg1, T2 arg2);
Run Code Online (Sandbox Code Playgroud)
所有这些都使用相同的结果进行编译.显然,编译器将(....)中的所有标识符视为"in",并将委托名称前面的返回类型视为"out",因此使用"in"和"out"in <内部是多余的. ......>.事实上,如果你错误地使用"in"和"out",那么编译器将无法编译.那么首先拥有它们有什么意义呢?
c# ×2