C#2.0 泛型方法
|
6.泛型方法 6.1 在C#2.0中,方法可以定义特定于其执行范围的泛型参数 public class MyClass<T> { public void MyMethod<T>(T t) { } } 即使包含类根本不使用泛型,也可以定义方法特定的泛型参数 注意:该功能仅适用于方法。属性或索引器只能使用在类的恶作用范围中定义的泛型参数 public class MyClass { public void MyMethod<T>(T t) { } } 6.2 在调用定义了泛型参数的方法时,可以提供要在调用场所使用的类型 public void Test() { MyClass obj = new MyClass(); obj.MyMethod<int>(3);
obj.MyMethod(3); } 因此,当调用该方法时,C#编译器将足够聪明,从而基于传入的参数的类型推断出正确的类型,并且它允许完全省略类型规范。 MyClass obj = new MyClass(); obj.MyMethod(3); 该功能成为泛型推理 但要注意:编译器无法只根据返回值得类型推断出类型 软件开发网 www.mscto.com public class MyClass1 { public T MyMethod<T>() { return default(T); } } 软件开发网 www.mscto.com public class Class31 { public void Test() { MyClass1 obj = new MyClass1(); int number = obj.MyMethod(); //Dose not complie //当方法定义它自己的泛型参数时,它还可以定义这些类型约束 int number = obj.MyMethod<int>(); 软件开发网 www.mscto.com } } 但是,你无法为类级别泛型参数提供方法级别约束。类级别泛型参数的所有约束都必须在雷作用范围中定义。6.2 在重写定义了泛型参数的虚拟方法时,子类方法必须重新定义该方法特定的泛型参数。
public class BaseClass33 { public virtual void SomeMethod<T>(T t) { } } 软件开发网 www.mscto.com public class SubClass33 : BaseClass33 { public override void SomeMethod<T>(T t) 软件开发网 www.mscto.com { base.SomeMethod<T>(t); } } 子类实现不能重复在基础方法级别出现的约束 public class BaseClass34 { public virtual void SomeMethod<T>(T t) where T : new() { } } public class SubClass34 : BaseClass34 { public override void SomeMethod<T>(T t)// where T : IComparable<T> 软件开发网 www.mscto.com { } } 软件开发网 www.mscto.com 此外,如果子类方法调用虚拟方法的基类实现,则它必须指定要替代泛型基础方法类型参数要指定的类型实参。可以自己显示指定它,或者依靠类型推理(如果可用) 软件开发网 www.mscto.com public class BaseClass35 { 软件开发网 www.mscto.com public virtual void SomeMethod<T>(T t) { } } public class SubClass35 : BaseClass35 { 软件开发网 www.mscto.com
public override void SomeMethod<T>(T t) { base.SomeMethod<T>(t); 软件开发网 www.mscto.com base.SomeMethod(t); } } 软件开发网 www.mscto.com
6.3 泛型静态方法:C#允许使用泛型参数的静态方法。但是,在调用这样的静态方法时,你需要在调用场所谓所包含的类提供具体的类型。
public class MyClass36<T> { 软件开发网 www.mscto.com public static T SomeMethod(T t) { return default(T); } }
public class Class36 { public void Test() { 软件开发网 www.mscto.com int number = MyClass36<int>.SomeMethod(3); } } 软件开发网 www.mscto.com
静态方法可以定义方法特定的泛型参数个约束,就像实例方法一样。在调用这个方法时,你需要在调用场所提供特定的类型。 public class MyClass37<T> { public static T SomeMethod<X>(T t, X x) { return default(T); } } public class Class37 { public void Test() { int number = MyClass37<int>.SomeMethod<string>(3, "AAA"); 软件开发网 www.mscto.com
int number1 = MyClass37<int>.SomeMethod(3, "AAA"); } } 或者类型推理,(如果可能) 泛型静态方法遵守施加于他们在类级别使用的泛型参数的所有约束。就像实例方法一样,你可以为静态方法定义泛型参数提供约束。 软件开发网 www.mscto.com
public class MyClass38 软件开发网 www.mscto.com
{ public static T SomeMethod<T>(T t) where T : IComparable<T> { return default(T); } } C# 中的运算符只是静态方法而已,并且C# 允许你为自定义的泛型重载运算符。源代码网推荐 源代码网供稿. |
