C#:anoperatorofatypeofgenericswithinheritance我对泛型类型的运算符比较有疑问。publicinterfaceISomeInterfacewhereT:SomeBaseClass{}publicclassSomeClass:SomeBaseClass{}现在我们要用is运算符检查类型。我们有一个实现接口ISomeInterface的类的实例。不幸的是,我们面临以下问题://someObjectisanInstanceofaclassimplementinginterfaceISomeInterfaceboolisSomeBaseClass=someObjectisISomeInterface;//falseboolisSomeClass=someObjectisISomeInterface;//true是否可以检查变量泛型类型?提前致谢,Toby这称为泛型协方差,在C#4.0中受支持。您可以使用out关键字标记通用T参数:publicinterfaceISomeInterfacewhereT:SomeBaseClass但是有一个限制。T参数只能作为接口中方法的返回类型出现。EricLippert有一系列关于这个主题的博客文章,我邀请您阅读。是的,您可以使用in和out关键字来利用协变和逆变:T作为参数,否则使用out将T作为返回类型。协变:当您可以从X转换为X时,类型是协变的。逆变:当您可以从X转换为X时,类型是逆变的。-其中S是子类,B是基类。我在阅读C#4.0书籍时学到的一个有趣示例是关于Stack的。类堆栈{inti;T[]array=newT[1000];publicvoidPush(Telement){array[i++]=element;}}classBaseClass{}classSubClass:BaseClass{}其实说明在这种情况下,Stack实现这个接口的时候,可以使用逆变:interfaceIPushable{voidPush(Telement);然后:IPushablestackB=newStack();IPushablestackS=stackB;stackS.Push(新的子类());虽然在这种情况下是协变的,但当Stack实现以下接口时:interfaceIPoppable{TPop();然后:IPoppablestackS=newStack();IPoppablestackB=stackB;BaseClassbaseClass=stackB.Pop();这非常有用,因为它允许Upcasts和Downcasts没有任何问题和编译时错误。我不确定我是否正确理解了你的问题,但是在检查类是否派生自泛型类时你可能需要一个答案:publicstaticboolIsSubclassOfRawGeneric(Typegeneric,TypetoCheck){while(toCheck!=null&&toCheck!=typeof(object)){varcur=toCheck.IsGenericType?toCheck.GetGenericTypeDefinition():toCheck;如果(通用==cur)返回真;toCheck=toCheck.BaseType;}返回假;你的第二个问题的答案首先,因为它似乎显示了你想要实现的目标:问:但是如果我想在IList上实现的对象是IList,我该如何检查它?您的推理似乎是因为字符串继承自对象,您需要一个条件模式来检查常见情况。IListstringList=newList();IListobjectList=newList();stringList是IList;///>truestringList是IList;///>falseobjectList是IList;///>falseobjectList是IList;///>true"someString"isobject//>true所以你只需要检查由Generic-Type:构造的类型和IsGenericType布尔值分别检查IsGenericType或IsGenericConstructedType。objectList.GetType().GenericTypeArguments[0]是对象///>truestringList.GetType().GenericTypeArguments[0]是对象///>true警告:检查null大小写;使用null合并和/或如果支持语言等null条件运算符...为了简洁和清晰起见,不在示例中问:是否可以检查变量(继承)泛型类型?除了Darin和fuex的回答之外,这里还有一些其他的提示:您可以使用Type和TypeInfo构造几乎任何条件检查以上是C#学习教程:C#:GenericTypeOperatorswithInheritance所有共享的,如果为真每个人都有用并且需要了解更多关于C#的学习教程。希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
