- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚了解到将泛型参数作为 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
会破坏类型安全被传给了吗?
object
的方法的返回值。到
string
类型的变量, 你是否可以?
string
的方法的返回值。到
object
类型的变量,为什么你不能对
out
做同样的事情?参数?也就是说,你为什么不能通过
out object
到
out string
范围?
out
中这一事实。参数,更不用说解释为什么必须这样做了。
最佳答案
与 out
参数 参数通过引用传递,就像 ref
,不同的是值必须在方法结束时赋值,引用不需要在调用前初始化。但是之前可以和方法初始化可以读取初始值 .
来自文档: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/
我有很多类都继承自一个基类——实际上它只是一个允许序列化的接口(interface)包装器: public abstract class VoucherRuleBase : IRule{ pu
我是 C# 的新手,我正在开发一个 rpg 游戏引擎。 我有我的基类 Item,它是 Weapon 和 Armour 的父类,武器和盔甲类有额外的变量,用于统计、武器插槽、盔甲类型等。 我的 Play
在使用新语言进行个人项目时,我遇到了一个烦人的编译时错误,我的 constants.h(常量类)的静态成员找不到类名(Quark,它是派生的Particle 类,这两个在同一个文件“Particle.
我无法从 BaseClass 隐式转换到它的DerivedClass .我有以下代码: class BaseClass { } class DerivedClass : BaseClass {
我正在尝试使用工厂方法返回派生类,但返回类型是基类类型。根据我的理解,我认为继承可以让我这样做,显然我错了。 WeightExercise 和 CardioExercise 均派生自 Exercise
我刚刚了解到将泛型参数作为 out 的类型参数强制该泛型类型保持不变。这让我很惊讶。我以为out参数被视为与返回类型相同(即如果泛型参数是协变的,那么它可以用作 out 输出参数),因为它们都是方法的
我遇到段错误但不知道为什么。使用std::unique_ptr(&DerivedClassObj)有问题吗?谢谢。 这是代码 # test.cc #include #include #includ
我尝试了下面的代码,并得到了一个编译错误。 class A {}; class B : public A {}; void f(A*& p) {} int main() { B* pB;
我有这样的基类: public class Scene { public IList Models {get; set;} } public class SceneModel { } 和像这样
我如何传递一个列表,该列表是一个 DerivedObjects 列表,其中方法需要一个 BaseObjects 列表。我正在转换列表 .ToList()并且想知道是否有更好的方法。我的第二个问题是语法
给定以下类定义: public class BaseClass { public string SomeProp1 { get; set; } } public class DerivedCl
我正在尝试传递 DerivedClass 的列表到接受 BaseClass 列表的函数,但我收到错误: cannot convert from 'System.Collections.Generic.
虽然我们可以从基类/接口(interface)继承,为什么我们不能声明一个List<>使用相同的类/接口(interface)? interface A { } class B : A { } cla
从下面的代码 sizeof(Base) == 24 和 sizeof(Derived) == 24。 为什么它们的大小相等? 在 Base 类中我们有 3 个成员,在 Derived 类中我们有另一个
我有一个包含此方法的通用存储库: public void Delete(T item) where T : EntityBase 我正在尝试为某些对象添加软删除行为; IE。删除时,它们不会从数据库中
我需要摆脱这个警告。据我了解,这似乎是因为 DerivedClass 不被视为普通旧数据。我读了关于 POD 的 cppreference和 Standard Layout Type但我仍然不明白为什
我对这个错误有疑问,添加默认构造函数并不能修复它。没有默认构造函数编译会产生错误,使用默认构造函数编译会产生错误。我已经在网上搜索了几个小时,但一无所获。这是我的代码的一个简单示例(实际代码相当长):
我几乎可以肯定我想做的事情有一个合适的术语,但由于我不熟悉它,我将尝试明确地描述整个想法。所以我拥有的是一组类,它们都继承自一个基类。所有类几乎完全由不同的方法组成,这些方法仅在每个类中相关。然而,有
我理解派生类的List<>不能直接赋值给基类的List<>。但是它如何允许将派生类的相同 List<> 分配给 IEnumerable<> 类型的基类参数。 public class Base {}
我有一个构造函数试图初始化基类中的一个字段。编译器提示。该字段 protected ,因此派生类应该具有访问权限。 //The base class: class BaseClass { public
我是一名优秀的程序员,十分优秀!