C#为什么支持协变的参数只能用于方法的返回值?支持逆变的参数只能用于方法参数?
2012-12-04 13:52
555 查看
“TParent不能安全转换成TSub”,是这两个问题的共同原因。
我们定义一个接口IFoo。
interface IFoo<T>
{
void Method1(T param);
T Method2();
}
我们看一下协变的过程:IFoo<TSub>转换成IFoo<TParent>。
Method1:将TSub替换成TParent,Method1显然存在 TParent到TSub的转换。
Method2:返回值类型从TSub换成了TParent,是类型安全的。
所以支持协变的参数只能用在方法的返回值中。
再看一下逆变的过程:IFoo<TParent>转换成IFoo<TSub>。
Method1:将TParent替换成TSub,Method1存在 TSub到TParent的转换,是类型安全的。
Method2:返回值类型从TParent换成了TSub,是不安全的。
所以支持逆变的参数只能用在方法的参数中。
我们定义一个接口IFoo。
interface IFoo<T>
{
void Method1(T param);
T Method2();
}
我们看一下协变的过程:IFoo<TSub>转换成IFoo<TParent>。
Method1:将TSub替换成TParent,Method1显然存在 TParent到TSub的转换。
Method2:返回值类型从TSub换成了TParent,是类型安全的。
所以支持协变的参数只能用在方法的返回值中。
再看一下逆变的过程:IFoo<TParent>转换成IFoo<TSub>。
Method1:将TParent替换成TSub,Method1存在 TSub到TParent的转换,是类型安全的。
Method2:返回值类型从TParent换成了TSub,是不安全的。
所以支持逆变的参数只能用在方法的参数中。
相关文章推荐
- C#中部分方法返回值类型为什么只能是void?
- 基础_C# 方法、方法参数和返回值、属性 、索引器 、访问修饰符 访问修饰符
- 为什么C#不支持函数默认参数呢
- 【转自JavaEye】为什么“局部内部类能且只能访问所在方法中的final类型的参数和变量”?
- 【C#基础】方法及其调用、构造方法、out与ref参数及其返回值、方法重载、静态方法等简单介绍
- 给大家一个新的加密方法,C#的。(国外的,只用于学习,支持中文)
- C#里泛型接口支持协变、逆变和不支持协变、逆变的对比?
- C# 通过反射获取MVC Controller里的类名,方法名,参数列表,返回值类型,Description描述,自定义Attribute
- C#中委托的匿名方法,及其在协变与逆变中的应用
- 调试webservice遇到“测试窗体只能用于使用基元类型作为参数的方法”的解决办法
- c#带参数和返回值的函数 开启线程调用的方法
- 在Scala中,为什么函数的参数类型是逆变的,而函数的返回值协变的
- More Effective C# Item8 :尽可能使用泛型方法,除非需要将类型参数用于实例的字段中
- 在C#、Java中,为什么不能用[返回值]区别重载方法?
- C#局域网中引用他人的WebService报“测试窗体只能用于来自本地计算机的请求方法”错的解决办法
- 编写高质量代码改善C#程序的157个建议——建议43:让接口中的泛型参数支持协变
- C# 方法、方法参数和返回值、属性 、索引器 、访问修饰符
- c# 匿名方法传参数 和有返回值
- C#只能靠参数而不能靠返回值类型的不同来区分方法重载
- <转>C# 4.0 为泛型编程引入了 协变 和 逆变 支持,这是个不错的福利,能省掉以往的一些麻烦。不过当前(Beta2)仅支持泛型接口和泛型委托。