Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同时通过引用和类型转换_C# - Fatal编程技术网

C# 同时通过引用和类型转换

C# 同时通过引用和类型转换,c#,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?你能解释一下吗?我是泛型的新手首先,我想问

在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?你能解释一下吗?我是泛型的新手

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

对于ref,它必须是精确匹配的;您可以使用:

Control tmp = c;
Callee(ref tmp);
c = (MyControl) tmp;
P> >考虑泛型:

private void Callee<T>(ref T c) where T : Control
{ ... }
然后您可以使用Calleeref c,它将推断T=MyControl

更新的重新评论

在泛型示例中,我们将被调用方声明为T的泛型方法,其中T至少是一个控件。这至少确保了我们仍然可以访问方法中的所有控件成员,因为控件的任何子类仍然拥有这些成员

泛型的行为有点像模板,但不完全一样。调用方在调用方法时可以指定T。因此调用者可以使用Callee…,这与调用现有的Calleeref控件c比较。或者他们可以使用Callee…,这类似于调用Calleeref MyControl c-在这两种情况下,T在整个方法中都被替换


然而,C编译器足够智能,通常不需要告诉它尖括号中的位;它可以看到您正在传递一个MyControl,因此除非您告诉它,否则它将假定它应该使用T=MyControl——这称为泛型类型推断。这里的要点是,它使ref与数据的子类一起使用变得很容易。

首先,我想问一下您是否需要ref——这似乎不寻常;这意味着您打算在方法内部重新分配变量?与更改所传递实例的属性不同

对于ref,它必须是精确匹配的;您可以使用:

Control tmp = c;
Callee(ref tmp);
c = (MyControl) tmp;
P> >考虑泛型:

private void Callee<T>(ref T c) where T : Control
{ ... }
然后您可以使用Calleeref c,它将推断T=MyControl

更新的重新评论

在泛型示例中,我们将被调用方声明为T的泛型方法,其中T至少是一个控件。这至少确保了我们仍然可以访问方法中的所有控件成员,因为控件的任何子类仍然拥有这些成员

泛型的行为有点像模板,但不完全一样。调用方在调用方法时可以指定T。因此调用者可以使用Callee…,这与调用现有的Calleeref控件c比较。或者他们可以使用Callee…,这类似于调用Calleeref MyControl c-在这两种情况下,T在整个方法中都被替换


然而,C编译器足够智能,通常不需要告诉它尖括号中的位;它可以看到您正在传递一个MyControl,因此除非您告诉它,否则它将假定它应该使用T=MyControl——这称为泛型类型推断。这里的要点是,它使ref与数据的子类一起使用变得很容易。

不,这是不可能的,这是一个很好的理由。假设您在被调用方中更改了c,并为其分配了另一个不是MyControl实例的控件的后代。

不,这是不可能的,这是有充分理由的。假设您在被调用方中更改了c,并为其分配了另一个不是MyControl实例的控件后代。

对象不是天生通过引用传递的吗?@Austin-确切地说,所有参数默认情况下都是通过值传递的,但对于引用类型,两个副本仍然指向同一个底层对象。但我知道你的意思-因此我的第一个问题是,你是否需要重新冷却。。。我还以为你把我的C杯弄得满地都是呢!对象本身不是通过引用传递的吗?@Austin-确切地说,所有参数默认都是通过值传递的,但是对于引用类型,两个副本仍然指向相同的底层对象。但我知道你的意思-因此我的第一个问题是,你是否需要重新冷却。。。我还以为你把我的C杯弄得满地都是呢!