You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET中基于接口的列表深拷贝实现是否可优化?

VB.NET深拷贝构造函数的优化实现

问题根源解析

你当前代码里第二个Select的核心作用是把IEnumerable(Of X)向上转型为IEnumerable(Of IX),原因在于:

  • Select(Of X)(...)返回的是IEnumerable(Of X),而mR的类型应该是List(Of IX)
  • 泛型协变仅支持IEnumerable(Of T)这类接口(且T为引用类型),但List(Of X)无法直接转换为List(Of IX),所以移除第二个Select后,编译器会因类型不匹配报错。

更优实现方式

无需两次Select,可以通过以下两种方式简化代码:

方式1:显式指定Select的返回类型为IX

直接在Select中声明泛型参数为IX,让编译器自动将New X转型为接口类型:

mR = r.Select(Of IX)(Function(a As IX, i As Integer) New X).ToList()

方式2:使用Cast()方法完成转型

如果更倾向于保留Select的X类型返回逻辑,可以在后续用Cast统一转型:

mR = r.Select(Of X)(Function(a As IX, i As Integer) New X).Cast(Of IX).ToList()

关键注意点:深拷贝的正确性

当前代码里New X只是创建X的空实例,没有复制传入的a As IX的属性值,这并不符合深拷贝的核心需求。你需要给X类添加支持深拷贝的构造函数,比如:

Public Class X
    Implements IX

    ' 示例属性
    Public Property Name As String
    Public Property Count As Integer

    ' 深拷贝构造函数
    Public Sub New(source As IX)
        Dim src = DirectCast(source, X)
        Me.Name = src.Name ' 值类型直接复制,引用类型需递归处理深拷贝
        Me.Count = src.Count
    End Sub

    ' 默认构造函数(按需保留)
    Public Sub New()
    End Sub
End Class

此时构造函数中的Select应改为:

mR = r.Select(Of IX)(Function(a As IX) New X(a)).ToList()

实例数量验证

按照优化后的代码执行你给出的测试逻辑:

Dim a As New List(Of IX) From {New X, New X} ' 2个X实例
Dim b As New Y(a) ' 创建2个新X实例(累计4个),1个Y实例
Dim c As New Y(b.R) ' 创建2个新X实例(累计6个),1个Y实例

完全符合你预期的6个X实例、2个Y实例的结果。

内容的提问来源于stack exchange,提问作者periblepsis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 00:40:04