【轉】編寫高質量代碼改善C#程序的157個建議——建議45:為泛型類型參數指定逆變
阿新 • • 發佈:2017-12-05
str 質量 red 方法的參數 turn test col nbsp 改善
建議45:為泛型類型參數指定逆變
逆變是指方法的參數可以是委托或者泛型接口的參數類型的基類。FCL4.0中支持逆變的常用委托有:
Func<int T,out TResult>
Predicate<in T>
常用委托有:
IComparer<in T>
下面例子演示了泛型類型參數指定逆變所帶來的好處:
class Program { static void Main() { Programmer p = new Programmer { Name = "Mike" }; Manager m= new Manager { Name = "Steve" }; Test(p, m); } static void Test<T>(IMyComparable<T> t1, T t2) { //省略 } } public interface IMyComparable<in T> { int Compare(T other); } public class Employee : IMyComparable<Employee> {public string Name { get; set; } public int Compare(Employee other) { return Name.CompareTo(other.Name); } } public class Programmer : Employee, IMyComparable<Programmer> { public int Compare(Programmer other) { returnName.CompareTo(other.Name); } } public class Manager : Employee { }
上面的例子中,如果不為接口IMyComparable的泛型參數T指定in關鍵字,將會導致Test(p,m)編譯錯誤。由於引入了接口的逆變性,這讓方法Test支持了更多的場景。在FCL4.0之後的版本的實際編碼中應該始終註意這一點。
轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技
【轉】編寫高質量代碼改善C#程序的157個建議——建議45:為泛型類型參數指定逆變