当前位置: 首页 > 编程语言 > C#

在方法中传递对派生对象的引用时出错分享

时间:2023-04-10 16:05:20 C#

C#学习教程:在方法中传递对派生对象的引用时出错传递给它(当然,控件是从databoundcontrol对象派生的)给定方法publicvoidCTLBindData(refDataBoundControlctl){...}尝试将派生控件传递给函数时发生错误例如以下代码DropDownListlister=newDropDownList();CTLBindData(参考列表);生成转换错误好的,我可以接受,但以下内容让我感到困惑(可能是因为我习惯了c++而不是c#)CTLBindData(ref(DataBoundControl)lister);在这种情况下,如果我收到错误“Areforoutparametermustbeanassignablevariable”澄清一下,Dropdownlist继承自DataBoundControl的列表控件,这对我来说没有意义,我应该能够传递任何对象。似乎是显式类型转换导致了问题。关于我做错了什么的任何线索?DC在调用方法之前执行转换:DataBoundControlcountrol=(DataBoundControl)lister;CTLBindData(参考控制);C#要求任何ref参数都是精确类型(无多态性),并且该类型的引用必须是可赋值的。这就是为什么您必须在单独的步骤中使用显式强制转换创建引用,以便该方法具有可以为其分配值的正确类型的引用。有关此主题的更多信息,请参阅为什么ref和out参数不允许类型更改?作者:EricLippert:如果你有一个接受“X”的方法,那么你必须传递一个X类型的表达式或一个可转换为X的表达式。例如,一个从X派生的类型的表达式。但是如果你有一个方法接受“refX””,你必须将ref传递给X类型的变量,句点。这是为什么?为什么不允许类型更改,就像我们对非ref调用所做的那样?AndrewHare是正确的,但在这种情况下,您可能甚至不想使用ref。C#中的对象已经通过引用传递*。(与值类型相反,除非您使用ref关键字,否则不会通过引用传递。)在极少数情况下,我能想到您实际上需要以这种方式传递引用类型。如果没有ref,您的原始代码应该可以正常工作。**不是真的,但如果您来自非C#背景,它更容易理解。引用实际上是按值传递的。有一篇关于这一切究竟如何运作的优秀文章。*AndrewHare回答得很好。您的对象必须在内部使用REF或OUT。例如:可以为空。以上就是C#学习教程:Errorwhenpassingareferencetoaderivedobjectinthemethod分享的所有内容,如果对大家有用还需要进一步了解C#学习教程,希望大家多多关注——DropDownListlister=newDropDownList();列表器=空;CTLBindData(参考列表);本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: