有没有办法在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?你能解释一下吗?我是仿制药的新手
答案 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的后代。