同时通过ref和typecast

时间:2009-01-30 22:42:46

标签: c#

有没有办法在C#中执行此操作?

private void Caller()
{
  MyControl c = new MyControl();
  Callee(ref c);                       //Here I want to cast c as Control and pass by ref
}

private void Callee(ref Control c)
{

}

在泛型示例中,它如何推断T = MyControl?你能解释一下吗?我是仿制药的新手

2 个答案:

答案 0 :(得分:3)

首先,我会问你是否需要 ref - 这似乎不寻常;这意味着你打算在方法中重新分配变量? (与更改传递的实例的属性不同)。

对于ref,它必须完全匹配;你可以使用:

Control tmp = c;
Callee(ref tmp);
c = (MyControl) tmp;

或者,考虑泛型:

private void Callee<T>(ref T c) where T : Control
{ ... }

然后您可以使用Callee(ref c),它会推断T = MyControl

(更新后的评论)

在通用示例中,我们将Callee声明为“T”的泛型方法,其中T 至少 a Control。这“至少”确保我们仍然可以访问方法内Control的所有成员(因为Control的任何子类仍然具有这些成员。)

泛型有点像模板(但不完全)。 调用者在调用方法时指定T。因此调用者可以使用Callee<Control>(...),这与调用现有的Callee(ref Control c)相比较。或者他们可以使用Callee<MyControl>(...),这就像调用Callee(ref MyControl c)一样 - 在这两种情况下,T都会在整个方法中被替换。

然而,C#编译器足够智能,通常你不需要在尖括号中告诉它;它可以看到你正在传递MyControl,所以它会假设(除非你另有说明)它应该使用T = MyControl - 这称为泛型类型推断。这里的要点是,它可以很容易地将ref与数据的子类一起使用。

答案 1 :(得分:1)

不,这是不可能的,这是有充分理由的。想象一下,你在Callee中改变c并为它控制另一个不是MyControl实例的Control的后代。