class in_out_ref { #region in 关键字 delegate void DContravariant<in A>(A argumen); static void objFunction(object obj) { Console.WriteLine("你变了"); } static void strFunction(string str) { Console.WriteLine(str); } #endregion static void Main(string[] args) { #region in关键字 // in关键字可指定类型参数是逆变的。 // 逆变使你使用的类型可以比泛型参数指定的类型派生程度更小。 DContravariant<object> f1 = objFunction; //DContravariant<string> f1 = objFunction; // 可以使用string类型参数传入in object DContravariant<string> f2 = strFunction; f2 = f1; // string类型可以向object转换。 f2("执行了"); #endregion #region out、ref关键字 // out、ref关键字允许调用方法修改实参的值 // out修饰的参数必须在function内被修改 // ref修饰的参数必须在调用function前赋值 string str1; outFunction(out str1); Console.WriteLine(str1); string str2 = string.Empty; refFunction(ref str2); Console.WriteLine(str2); #endregion } static void outFunction(out string str) { str = "我被out了"; } static void refFunction(ref string str) { str = "我被ref了"; } }