1. 程式人生 > >【轉】編寫高質量代碼改善C#程序的157個建議——建議45:為泛型類型參數指定逆變

【轉】編寫高質量代碼改善C#程序的157個建議——建議45:為泛型類型參數指定逆變

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) { return
Name.CompareTo(other.Name); } } public class Manager : Employee { }

上面的例子中,如果不為接口IMyComparable的泛型參數T指定in關鍵字,將會導致Test(p,m)編譯錯誤。由於引入了接口的逆變性,這讓方法Test支持了更多的場景。在FCL4.0之後的版本的實際編碼中應該始終註意這一點。

轉自:《編寫高質量代碼改善C#程序的157個建議》陸敏技

【轉】編寫高質量代碼改善C#程序的157個建議——建議45:為泛型類型參數指定逆變