gpt4 book ai didi

c# - 作业兼容性有问题?

转载 作者:太空宇宙 更新时间:2023-11-03 21:31:55 25 4
gpt4 key购买 nike

我想做的是使用一次调用返回一个基类的 2 个扩展的集合。这是我所拥有的:

public interface IView
{
int Id { get; set; }
}

然后我有一个实现这个接口(interface)的领域模型

public class View: IView
{
public int Id { get; set; }
}

然后我有几个继承自基类的类

public class ViewA: View
{
public string PropertyA { get; set; }
}

public class ViewB: View
{
public string PropertyB { get; set; }
}

从这里我有一个列表,我试图包含这两个:

var views = new List<IView>();

并从我的基础创建一个 View ,因为 ViewA 和 ViewB 都有 ID

var view = new View();
view.Id = 1;

现在我正在尝试将其转换为 ViewA,这样我就可以像这样设置 PropertyA:

var viewA = (ViewA)view;

但调试器告诉我不能将“view”强制转换为 ViewA(编译正常)。

Unable to cast object of type 'View' to type 'ViewA'

我确定我在理解接口(interface) -> 基类继承时遗漏了一些东西,但我认为您可以通过这种方式将“较小”的类转换为“更定义”的类。阅读有关协变、逆变和赋值兼容性的信息,我认为我应该能够做到这一点;显然不是..

我想做的是返回两种类型 View 的集合(因此是列表),这样我可以在需要时将它们转换为更明确的 View ,而在我只需要公共(public)属性时将它们保留为基本 View .

我不想在 ViewA 和 ViewB 中有重复的属性,我正在尝试做的是可能的还是我完全错了?

最佳答案

I'm sure i'm missing something in my understanding of interface -> base class inheritance but i thought you could cast a "lesser" class to a "more defined" class this way. reading about covariance, contravariance, and assignment compatibility, i would think i should be able to do this; apparently not though..

你搞反了(我认为)。您始终可以将派生类型的实例强制转换为基类型,但反之则不行。如果将实例转换为派生类型,则它在运行时必须是该类型的实例。

看起来您正在尝试做的是以某种方式从 View 的实例创建 ViewA 的实例。这不是类型转换的工作方式。

这是一个可以工作的示例,可能会有所帮助。如果您有自己的观点列表:

var views = new List<IView>();

然后添加 ViewA 的实例:

views.Add(new ViewA());

现在,编译器“不知道”views[0] 是一个 ViewA——它是一个 IView 的列表毕竟。在这种情况下,您比编译器知道的更多,并且转换是合适的:

var viewA = (ViewA)views[0];

您还提到:

I'd rather not have duplicated properties in ViewA and ViewB

除非我遗漏了什么,否则您没有复制任何属性。 ViewAViewB 具有不同的属性,它们继承了 View 类的 Id 属性。

换句话说,这看起来不错:

var view = new ViewA();

view.Id = 4;

关于c# - 作业兼容性有问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23728536/

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