/// <summary>
/// 协变和逆变允许数组类型、委托类型和泛型类型参数进行隐式引用转换。 协变保留分配兼容性,逆变与之相反。
/// 协变和逆变只能用于引用类型,不能用于值类型或void
/// </summary>
public class CovarianceAndContravariance : IFace
{
public CovarianceAndContravariance()
{
///分配兼容性
string str = "test";
object obj = str;
///数组的协变允许派生程度更大的类型的数组隐式转换为派生程度更小的类型的数组,但是此操作运行时不是类型安全的操作.
object[] array = new String[10];
// array[0] = 10;
///方法的协变和逆变
Func<object> del = GetString;
//Func<string> del00 = GetObject; //返回值不能逆变
Action<string> del2 = SetObject;
//Action<object> del22 = SetString; //参数不能协变
Action<object> actObject = SetObject;
Action<string> actString = actObject;
// 泛型类型参数进行隐式引用转换
IEnumerable<string> strings = new List<string>();
IEnumerable<object> objects = strings;
}
static object GetObject() { return null; }
static void SetObject(object obj) { }
static string GetString() { return ""; }
static void SetString(string str) { }
/// <summary>
/// 接口不存在协变和逆变
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public string func(object obj)
{
return null;
}
public object func2(string obj)
{
return null;
}
}
public interface IFace
{
string func(object obj);
object func2(string obj);
}
协变和逆变
最新推荐文章于 2023-04-13 11:20:51 发布