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

Dev*_*ris 4 .net c# inheritance reference

在c#中,我试图实现一个方法,我可以使用它将数据绑定到我传递给它的任何控件(当然,控件是从数据绑定控件对象派生的)

给定方法

 public void CTLBindData(ref DataBoundControl ctl){ ... }
Run Code Online (Sandbox Code Playgroud)

尝试将派生控件传递给函数时出现错误
,例如以下代码

DropDownList lister = new DropDownList();  
CTLBindData(ref lister);
Run Code Online (Sandbox Code Playgroud)

生成转换错误

好的我可以接受,但以下让我困惑(可能是因为我习惯了c ++而不是c#)

CTLBindData(ref (DataBoundControl)lister);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我得到错误"一个ref或out参数必须是一个可赋值的变量"

为了澄清,Dropdownlist继承自继承DataBoundControl的列表控件

这对我来说没有任何意义我应该能够传递任何从数据绑定控件派生的对象.似乎显式的类型转换导致了这个问题.

关于我做错了什么的线索?

DC

And*_*are 7

在调用方法之前执行强制转换:

DataBoundControl countrol = (DataBoundControl)lister;
CTLBindData(ref control);
Run Code Online (Sandbox Code Playgroud)

C#要求任何ref参数都具有确切类型(无多态性),并且该类型的引用必须是可分配的.这就是您必须在单独的步骤中通过显式强制转换创建引用的原因,因此该方法具有可以为其分配值的正确类型的引用.

有关此主题的更多信息,请参阅为什么ref和out参数不允许类型变化?作者:Eric Lippert:

如果你有一个带有"X"的方法,那么你必须传递一个X类型的表达式或者一个可转换为X的表达式.比如,一个从X派生的类型的表达式.但是如果你有一个方法需要一个"ref X" ",你必须将ref传递给X类型的变量,句点.这是为什么?为什么不允许类型变化,就像我们使用非ref调用一样?