为什么我不能转换ref参数?

时间:2009-09-15 18:48:12

标签: c#

我有一个带有ref控件类型参数的方法,我想通过传递ref按钮类型参数来调用它。

编译器不接受这个,我必须将ref控件类型更改为ref按钮类型。

为什么?

5 个答案:

答案 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节)。

否则,可能会将不合适类型的值(对您的按钮字段引用复选框实例)分配给您传递的变量。