gpt4 book ai didi

c# - C# 是否支持返回类型协变?

转载 作者:IT王子 更新时间:2023-10-29 03:41:14 25 4
gpt4 key购买 nike

我正在使用 .NET 框架,我真的希望能够制作我所有网站都使用的自定义类型的页面。当我试图从控件访问页面时出现问题。我希望能够返回我特定类型的页面而不是默认页面。有什么办法吗?

public class MyPage : Page
{
// My own logic
}

public class MyControl : Control
{
public MyPage Page { get; set; }
}

最佳答案


更新:这个答案写于 2011 年。经过 20 年人们为 C# 提出返回类型协变后,他们已经实现了。请参阅 https://devblogs.microsoft.com/dotnet/c-9-0-on-the-record/ 中的协变返回.


听起来您想要的是返回类型协方差。 C# 不支持返回类型协变。

返回类型协变是指用返回更具体类型的基类方法覆盖返回不太具体类型的基类方法:

abstract class Enclosure
{
public abstract Animal Contents();
}
class Aquarium : Enclosure
{
public override Fish Contents() { ... }
}

这是安全的,因为 Contents via Enclosure 的消费者希望看到动物,而水族馆 promise 不仅会满足该要求,而且还会做出更严格的 promise :动物始终是鱼。

这种协变在 C# 中不受支持,而且不太可能永远受支持。 CLR 不支持它。 (它由 C++ 和 CLR 上的 C++/CLI 实现支持;它通过生成我在下面建议的那种神奇的辅助方法来实现。)

(一些语言也支持形式参数类型逆变——你可以用一个接受 Animal 的方法重写一个接受 Fish 的方法。同样,契约被履行;基类要求处理任何 Fish,并且派生类 promise 不仅可以处理鱼,还可以处理任何动物。同样,C# 和 CLR 不支持形式参数类型逆变。)

解决此限制的方法是执行以下操作:

abstract class Enclosure
{
protected abstract Animal GetContents();
public Animal Contents() { return this.GetContents(); }
}
class Aquarium : Enclosure
{
protected override Animal GetContents() { return this.Contents(); }
public new Fish Contents() { ... }
}

现在,您既可以获得重写虚方法的好处,又可以在使用编译时类型 Aquarium 时获得更强的类型。

关于c# - C# 是否支持返回类型协变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5709034/

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