gpt4 book ai didi

c# - 为什么我不能从 'out BaseClass' 转换为 'out DerivedClass' ?

转载 作者:行者123 更新时间:2023-12-03 14:13:42 25 4
gpt4 key购买 nike

我刚刚了解到将泛型参数作为 out 的类型参数强制该泛型类型保持不变。这让我很惊讶。我以为out参数被视为与返回类型相同(即如果泛型参数是协变的,那么它可以用作 out 输出参数),因为它们都是方法的“输出”。
经过一番调查,我意识到你不能这样做:

public class Program {
public static void Main() {
// cannot convert from 'out object' to 'out string'
F(out object s); // passing an out object
}

public static void F(out string o) {
o = null;
}
}
这解释了为什么 out参数必须是不变的。但是,我仍然不明白为什么你不能这样做。众所周知, out参数只是返回值的另一种方式。 F可以用返回值重写,它会起作用:
// This is the semantically equivalent version of the above, just without "out"
public class Program {
public static void Main() {
object s = F();
}

public static string F() {
return null;
}
}
那么为什么第一个代码片段不能编译呢?是否使用 out允许 F做一些不能用返回值做的事情,如果 out object s 会破坏类型安全被传给了吗?
我找到了 this question ,这是关于转换另一种方式 - 从派生类到基类,这显然是不可能的。您不能分配返回 object 的方法的返回值。到 string 类型的变量, 你是否可以?
我要问的是,因为您可以分配返回 string 的方法的返回值。到 object 类型的变量,为什么你不能对 out 做同样的事情?参数?也就是说,你为什么不能通过 out objectout string范围?
我还阅读了 docsspec ,但他们从未提及您必须将完全相同的类型传递到 out 中这一事实。参数,更不用说解释为什么必须这样做了。

最佳答案

out参数 参数通过引用传递,就像 ref ,不同的是值必须在方法结束时赋值,引用不需要在调用前初始化。但是之前可以和方法初始化可以读取初始值 .
enter image description here
来自文档:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/out-parameter-modifier

The out keyword causes arguments to be passed by reference


It is like the ref keyword, except that ref requires that the variable be initialized before it is passed


由于该方法可以读取变量,因此引用的类型必须是 string上类。读取阻止协方差,输出阻止逆变,因此参数必须是不变的。

关于c# - 为什么我不能从 'out BaseClass' 转换为 'out DerivedClass' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63858575/

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