泛型方法类型推断 有以下代码:
1 2 3 4 5 6 static List<T> MakeList<T>(T first,T second); { ...... } List<string> list = MakeList<string>("a1","b1"); 可以简写成:
1 List<string> list = MakeList("a1","b1"); 在这里就使用到了泛型类型推断,但是类型推断只适用于泛型方法。
默认值表达式 在一个泛型类当中,你如果要知道该类型参数的默认值,不能使用null,因为类型参数可能被约束为值类型,你也不能使用0,因为也有可能被约束为引用类型。在C#2当中提供了默认值表达式default(T),就可以返回类型实参的默认值。
1 2 3 4 5 6 7 8 9 10 static int CompareToDefault<T>(T value) where T : IComparable<T> { return value.CompareTo(default(T)); } Console.WriteLine(ComparaToDefault("x")); //1 Console.WriteLine(ComparaToDefault(10)); //1 Console.WriteLine(ComparaToDefault(0)); //0 Console.WriteLine(ComparaToDefault(-10)); //-1 Console.WriteLine(ComparaToDefault(DateTime.MinValue)); //0 由CompareTo文档指出,所有引用类型的值都大于null,所以返回1,CompareTo,如果比较的值比自己大则为1,相等则为0,小于则为-1。 不过如果传入的是null,以上代码会如预期的抛出NullReferenceException异常,我们可以使用IComparer<T>。
泛型比较 如果一个类型参数是未被约束的,那么只能在泛型类直线中对该类型的值与null进行比较的时候才可以使用!=、==操作符。 如果类型参数被约束为值类型,那么就完全不能使用!=、==操作符。 如果他只是一个引用类型,则只能进行简单的引用比较,可以使用!=、==操作符。 如果他被进一步约束成继承自某个重载了的!=、==操作符的特定类型(即转换类型约束),就会使用重载操作符。
如果调用者指定的类型实参恰巧也进行了重载,那么这个重载操作符是不会使用的 1 2 3 4 5 6 7 8 9 10 static bool AreReferenceEqual<T>(T first,T second) where T : class { return first == second; } string name = "Jon"; string intro1 = "Hello " + name; string intro1 = "Hello " + name; Console.