2009-01-30 60 views
1

有没有办法在C#中做到这一点?同时通过ref和typecast传递

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?你能解释一下吗?我是一个仿制药的新手

回答

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与数据的子类一起使用。

+0

对象本身是不是通过引用传递的? – 2009-01-30 22:55:36

1

不,这是不可能的,这有一个很好的理由。假设你在被调用者中改变了c,并为它赋予了另一个不是MyControl实例的Control的后代。