首 页IT知识库收藏内容
当前位置:翔宇亭IT乐园IT知识库C#C#其它

关于C#泛型

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2010-08-28 07:48:00

7、泛型和强制类型转换

(1)C#编译器只允许将泛型参数隐式转换到Object或约束指定的类型

如:

interface IS{...}
class BaseClass{...}
class MyClass <T> where T:BaseClass,IS
{
void SomeMethod(T t)
{
IS obj1 = t;
BaseClass obj2 = t;
object obj3 = t;
}
}

(2)编译器允许你将泛型参数显示强制转换到其他任何借口,但不能将其转换到类

interface IS{...}
class SomeClass{...}
class MyClass <T> //没有约束
{
void SomeMethod(T t)
{
IS obj1 = (IS)t; //可以
SomeClass obj2 = (SomeClass)t //不可以
}
}

(3)可以使用临时的Object变量,将泛型参数强制转换到其他任何类型

class SomeClass{...}
class MyClass <T>
{
void SomeMethod(T t)
{
object temp = t;
SomeClass obj = (SomeClass)temp;//可以
}
}

注意:这里只是告诉你这样写是可以的,但是要不要这样写?不要这样写,因为如果t确实没有继承SomeClass编译没错但是运行就会出错

(4)解决上面强制转换问题,可以使用is和as运算符进行判断

public class MyClass <T>
{
public void SomeMethod <T t>
{
if (t is int ){...}
if (t is LinkedList <int,string> ){...}
//如果泛型参数的类型是所查询的类型,则is运算符返回true
string str = t as string;
//如果这写类型兼容,则as将执行强制类型转换,否则将返回null
if (str != null){...}
LinkedList <int,string> list = t as LinkedList <int,string> ;
if (list != null){...}
}
}

8、继承和泛型

(1)在从泛型基类派生,可以提供类型实参,而不是基类泛型参数

public class BaseClass <T> {...}

public class SubClass:BaseClass <int>

(2)如果子类是泛型,而非具体的类型实参,则可以使用子类泛型参数作为泛型基类的指定类型

public class BaseClass <TT> {...}

public class SubClass <T> :BaseClass <T> {...}

(3)在使用子类泛型参数时,必须在子类级别重复在基类级别规定的任何约束

(4)基类可以定义其签名使用泛型参数的虚礼方法,在重写它们时,子类必须在方法签名中提供相应的类型。

如:

public class BaseClass <T>
{
public virtual T SomeMethod()
{...}
}
public class SubClass:BaseClass <int>
{
public override int SomeMethod()
{...}
}

(5)如果该子类是泛型,则它还可以在重写时使用它自己的泛型参数

public class SubClass <T> :BaseClass <T>
{
public override T SomeMethod()
{...}
}

(6)你可以定义泛型接口、泛型抽象类,甚至泛型抽象方法。

(7)不能对泛型参数使用+或+=之类的运算符

public class Calculator <T>
{
public T Add (T arg1,T arg2)
{
return arg1 + arg2;//错误
}
}

但是我们可以通过泛型抽象类、接口来实现在个功能,因为实现泛型抽象类、接口我们就已经明确传一个参数了,就可以执行诸如+这样的操作。

9、泛型方法

(1)方法可以定义特定于其执行范围的泛型参数

public class MyClass <T>
{
public void MyMethod <X> (X x)
{...}
}

(2)即使各包含类根本不使用泛型,你也可以定义方法特定的泛型参数

public class MyClass
{
public void MyMethod <T> (T t)
{...}
}

注意:该功能只使用于方法,属性,索引器只能使用在类的作用范围中定义的泛型参数。

(3)调用泛型方法

MyClass obj = new MyClass();

obj.MyMethod <int> (3);

也可以这样:

MyClass obj = new MyClass();

obj.MyMethod(3); //该功能称为泛型推理

(4)泛型方法也可以有自己的泛型参数约束

pubic class MyClass
{
public void SomeMethod <T> (T t) where T:IComparable <T>
{...}
}

(5)子类方法实现不能重复在父级别出现的约束
public class BaseClass
{
public virtual void SomeMethod <T> (T t)where T:new()
{...}
}
pubic class SubClass:BaseClass
{
public override void SomeMethod <T> (T t)//不能再有约束
{...}
}

(6)静态方法

静态方法可以定义特定的泛型参数和约束

public class MyClass <T>
{
public static T SomeMethod <X> (T t,X x)
{...}
}

int number = MyClass <int> .SomeMethod <string> (3, "AAA ");

或者:int mumber = MyClass <int> .SomeMethod(3, "AAA ");

10、泛型委托

(1)在某个类中定义的委托可以利用该类的泛型参数

(2)委托也可以定义自己的泛型参数


本文源自:翔宇亭——IT乐园(http://www.biye5u.com),转载请保留此信息!

上一页  [1] [2] 

微信搜索“优雅的代码”关注本站的公众号,或直接使用微信扫描下面二维码关注本站公众号,以获取最新内容。

个人成长离不开各位的关注,你的关注就是我继续前行的动力。

Tags:泛型 C#

知识评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
愿您的精彩评论引起共鸣,带来思考和价值。
用户名: 查看更多评论
分 值:100分 90分 80分 70分 60分 40分 20分
内 容:
验证码:
关于本站 | 网站帮助 | 广告合作 | 网站声明 | 友情连接 | 网站地图
本站部分内容来自互联网,如有侵权,请来信告之,谢谢!
Copyright © 2007-2024 biye5u.com. All Rights Reserved.