WEB开发网
开发学院软件开发C语言 C# 特性之泛型 阅读

C# 特性之泛型

 2010-09-30 22:35:56 来源:WEB开发网   
核心提示: 下面我们来看看泛型在.NET中使用的一些需要注意的地方,1. 泛型在嵌套类中的使用,C# 特性之泛型(2),嵌套的子类会自动继承(?)包裹类的泛型类型,当然,下面可以看个简单的例子(注:这个例子仅作说明用,不一定恰当),你也可以在嵌套类中覆盖掉包裹类的类型,不过编译器会在编译的时候发出警告来提醒

下面我们来看看泛型在.NET中使用的一些需要注意的地方。

1. 泛型在嵌套类中的使用。嵌套的子类会自动继承(?)包裹类的泛型类型,当然,你也可以在嵌套类中覆盖掉包裹类的类型,不过编译器会在编译的时候发出警告来提醒用户注意避免误写。e.g.

class Container<T, U>
{
//编译器会在这里发出警告
//告诉用户这里的泛型和包裹类相同
class Nested<U>
{
void Method(T p0, U p1)
{
}
}
}

2. 协变和逆变的问题。关于协变和逆变的定义简单来说就是泛型类型是否允许子类和父类之间转换,这里不做详细讨论,读者如果有兴趣可以参考这篇文章。在.net 4.0以前是不支持协变和逆变的,这也让我们的代码有些时候实现起来很别扭。下面可以看个简单的例子(注:这个例子仅作说明用,不一定恰当)。

首先我们定义两个数据类型,IData和IOperation:

interface IData{void method();}
interface IOperation<T> where T : IData{ void Run(T data);}

然后我们分别定义不同类型的数据和操作类:

代码

class AddData : IData{
public int A1, A2;
public void method() { }
}
class Add : IOperation<AddData>{
public void Run(AddData d)
{
Console.WriteLine(d.A1 + d.A2);
}
}
class ComplexData : IData{
public void method() { }
public int A1, A2, B1, B2;
}
class ComplexAdd : IOperation<ComplexData>{
public void Run(ComplexData d)
{
Console.WriteLine("{0}+{1}i",d.A1 + d.A2,d.B1+d.B2);
}
}

上一页  1 2 3 4 5  下一页

Tags:特性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接