我有一个带有ref控件类型参数的方法,我想通过传递ref按钮类型参数来调用它。
编译器不接受这个,我必须将ref控件类型更改为ref按钮类型。
为什么?
答案 0 :(得分:26)
因为这会导致很多问题......
public void DoDarkMagic(ref Control control)
{
control = new TextBox();
}
public void Main()
{
Button button = new Button();
DoDarkMagic(ref button);
// Now your button magically became a text box ...
}
答案 1 :(得分:9)
您可以使用泛型来解决某些输入限制。
void Test<T>(ref T control)
where T: Control
{
}
现在你可以致电:
Button b = new Button()
Test(b);
您可以将任何类型的引用传递给它,该引用来自控件。
现实生活场景:
protected static void BindCollection<T>(
T list
, ref T localVar
, ref ListChangedEventHandler eh // the event handler
, ListChangedEventHandler d) //the method to bind the event handler if null
where T : class, IBindingList
{
if (eh == null)
eh = new ListChangedEventHandler(d);
if (list != null && list != localVar)
{
if (localVar != null)
localVar.ListChanged -= eh;
localVar = list;
list.ListChanged += eh;
}
else if (localVar != null && list == null)
{
localVar.ListChanged -= eh;
localVar = list;
}
}
public override BindingList<ofWhatever> Children
{
get{//..}
set
{
//woot! a one line complex setter
BindCollection(value, ref this._Children, ref this.ehchildrenChanged, this.childrenChanged);
}
}
答案 2 :(得分:7)
来自C#规范:
当形式参数是参考时 参数,对应的参数 在方法调用中必须包含 关键字ref后跟a 变量引用(第12.3.3节) 与形式参数相同的类型
答案 3 :(得分:2)
通常,ref需要精确的类型匹配,不允许显式或隐式转换。
显示一些代码,以便我们讨论细节和替代方案。
答案 4 :(得分:1)
根据C#规范:
当形式参数是引用参数时,方法调用中的相应参数必须包含关键字ref,后跟与形式参数相同类型的变量引用(第5.3.3节)。
否则,可能会将不合适类型的值(对您的按钮字段引用复选框实例)分配给您传递的变量。