C4.0和VS2010新特性(4)
时间:2025-04-20
时间:2025-04-20
介绍VS2010的新特性等一些新功能
{
return (V) value;
}
public void Input(T tv)
{
value = tv;
}
}
这样就出现了问题——首先,iobj1指向iobj2(接受一个Father的参数,此时如果我的Father输入的是Son2,那么实际转化到Son的时候就发生异常了;同样地,输出因为是Son2不能转化成Son,因此发生异常)。
这个问题就是因为输入输出方向不明确所导致的。如果我们强制是一开始就给出的输入(输出方向)。即V只能作为输入,T只能作为输出就可以了。
推而广之,假设存在两个泛型T和V,假设V:T(V是T的子类)。那么泛型接口之间转换的一般规则是:输出类型是父类,“输出”一般是协变;反之,输入类型是子类,一般是反变。约束这种输入输出泛型的规则就是:输出线的接口加关键词out,输入加in。如下所示:
Interface InAndOut<out T, in V>
{
void Input(V value);
T Output();
}
那么你输入以下代码,就可以输出结果:
InAndOut<Father, Son> iobj1 = new Program < Father, Son >();
InAndOut<Son, Father> iobj2 = new Program < Son, Father >();
这种规则本质上是编译器的行为理解。但是不一定就是正确结果,考察下列例子: InAndOut<Father, Son> iobj1 = new Program < Father, Son >();
InAndOut<Son2, Father> iobj2 = new Program < Son2, Father >();
这一段代码照样可以通过编译,但是运行仍旧报异常。为什么呢?因为“输入端”和“输出端”尽管都符合了隐式转换的条件,但是你注意:把一个Son对象存储到iobj2的时候,iboj2的输出要求是Son2,而不是Son! 因此要保证运行正确,必须做到这样:
InAndOut<Father, Son> iobj1 = new Program < Father, Son >();
InAndOut<Son, Father> iobj2 = new Program < Son, Father >();
输入端接受Son,能够隐式转成蓝色的Father,蓝色Father存储的子类对象同样必须可以转化成Son(即一个协变的东西必须能够支持其反变;反之,一个反变的泛型必须支持其协变泛型,这就是著名的“协变反变类型”,简称“协-反变类型”)。
上一篇:量表简介总结
下一篇:协信中心商业项目提案