.net - IDisposable : Method 'X' has multiple definitions with identical signatures

标签 .net arrays vb.net generics extension-methods

设想

我编写了这些扩展方法来以优雅/简化的方式初始化和/或处理 Array 的所有元素,以避免代码重复:

<HideModuleName>
Public Module ArrayExtensions

        <Extension>
        Public Sub InitializeAll(Of T As New)(ByVal sender As T())
            For index As Integer = 0 To (sender.Length - 1)
                sender(index) = New T
            Next index
        End Sub

        <Extension>
        Public Sub InitializeAll(Of T As IDisposable)(ByVal sender As T())
            ArrayExtensions.DisposeAll(sender)
            For index As Integer = 0 To (sender.Length - 1)
                sender(index) = Activator.CreateInstance(Of T)()
            Next index
        End Sub

        <Extension>
        Public Sub DisposeAll(Of T As IDisposable)(ByVal sender As T())
            For index As Integer = 0 To (sender.Length - 1)
                If (sender(index) IsNot Nothing) Then
                    sender(index).Dispose()
                    sender(index) = Nothing
                End If
            Next index
        End Sub

End Module

目的是在像这样的常见场景中使用它:
Dim myCollection As MyDisposableType() = New MyDisposableType(100) {}

myCollection.InitializeAll()
myCollection.DisposeAll()

问题

我发现的问题是编译器显示此错误:

'Public Sub InitializeAll(Of T As New)(sender() As T)' has multiple definitions with identical signatures.



...自从 IDisposable 以来,我不太明白这个错误。是一个接口(interface),我试图删除类型参数的“ As New ”但仍然显示相同的错误。

问题

如何调整 InitializeAll() 的类型参数避免此错误并仍在预期行为中工作的方法?,我的意思是一种方法接受一次性对象数组,而另一种方法接受非一次性对象。

我知道我可以将两种方法的逻辑融合/合并到一个方法中,如下所示:
<Extension>
Public Sub InitializeAll(Of T As New)(ByVal sender As T())

    For index As Integer = 0 To (sender.Length - 1)

        If (sender(index) IsNot Nothing) Then

            If sender(index).GetType.GetInterfaces.Contains(GetType(IDisposable)) Then
                DirectCast(sender(index), IDisposable).Dispose()
                sender(index) = Nothing
            End If

        End If

        sender(index) = New T

    Next index

End Sub

但我更喜欢使用两种不同的方法,因为这样我就可以在不传递一次性对象数组时避免额外的检查,从而获得性能。

最佳答案

这里真正的问题是当对象具有 Constructor 并且也是 IDisposable 时会发生什么? 调用哪个方法?这就是为什么它会导致问题。

泛型类型不能用于重载,因为编译器无法在编译时区分两种不同的类型,因此认为它们是相同的......

所以要么你创建一个真正的重载,比如:

'Would mean you can Dispose them, but you have to load the method with Reflection
Public Overload Sub InitializeAll(of T As New)(ByVal Sender As T(), ByVal CollectionIsDisposable As Boolean)

'So here they are not disposable...
Public Overloads Sub InitializeAll(of T As New(ByVal Sender As T())

在那里你得到了一个真正的重载,但正如你所说,它可能会破坏你的逻辑,然后只使用一种方法,并检查对象是否实现 IDisposable .

关于.net - IDisposable : Method 'X' has multiple definitions with identical signatures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35970875/

相关文章:

javascript - 仅序列化更改的表单元素时如何处理空数组

c - Linux,field_buffer不提供UTF-8字符串

vb.net - 如何一次执行四个查询然后检查成功或失败?

.net - NUnit 3 : OneTimeSetUp doesn't fire

javascript - 在键值对的唯一组合上合并对象

c# - 如何通过 Internet 部署 Windows 应用程序

.net - CInt 不会一致地舍入 Double 值 - 如何删除小数部分?

c# - WCF 客户端 `using` block 问题的最佳解决方法是什么?

c# - AOP Postsharp,记录变量值

c# - 计算 XDocument 上的子节点