当前位置:首页 > 网络编程 > 软件语言 > .NET > C#2.0 泛型方法

C#2.0 泛型方法

点击次数:46 次 发布日期:2008-11-06 07:52:11 作者:源代码网
源代码网推荐
广告载入中

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# 允许你为自定义的泛型重载运算符。

源代码网推荐

源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华