Csharp/C#教程:C#类型转换错误,尽管通用约束分享


C#类型转换错误,尽管通用约束

为什么,对于类P的类型参数T的“必须从Ainheritance”的通用约束,第一次调用成功但第二次调用失败并且注释中详细说明了类型转换错误:

abstract class A { } static class S { public static void DoFirst(A argument) { } public static void DoSecond(ICollection argument) { } } static class P where T : A, new() { static void Do() { S.DoFirst(new T()); // this call is OK S.DoSecond(new List()); // this call won't compile with: /* cannot convert from 'System.Collections.Generic.List' to 'System.Collections.Generic.ICollection' */ } } 

通用约束不应该确保List确实是ICollection吗?

这是C#在generics类型上缺乏协方差的一个例子(C# 确实支持数组协方差)。 C#4将在接口类型上添加此function,并且还将更新多个BCL接口类型以支持它。

请参阅C#4.0:协方差和逆变 :

在本文中,我将尝试介绍一种C#4.0创新。 其中一个新function是类型参数的协方差和逆变,现在由通用委托和通用接口支持。 首先让我们看看这些词是什么意思:)

您已强烈键入DoSecond的参数作为类型ICollection 。 尽管T是A类型的事实,但在编译时,List 和ICollection 之间没有隐式转换 。 您需要创建列表并在调用DoSecond时将其强制转换为ICollection ,或者使DoSecond本身成为通用方法。

注意:C#4.0应该支持这种类型的隐式强制转换,这将提供比C#3.0提供的更好的协同/反演。

上述就是C#学习教程:C#类型转换错误,尽管通用约束分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1007375.html

(0)
上一篇 2021年12月29日
下一篇 2021年12月29日

精彩推荐