gpt4 book ai didi

c# - 同时通过 ref 和 typecast

转载 作者:太空宇宙 更新时间:2023-11-03 22:27:59 26 4
gpt4 key购买 nike

有没有办法在 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;

或者,考虑泛型:

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

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

(更新评论)

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

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

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

关于c# - 同时通过 ref 和 typecast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497575/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com