.net – IDisposable:方法’X’具有多个具有相同签名的定义

.net – IDisposable:方法’X’具有多个具有相同签名的定义,第1张

概述情景 我编写了这些扩展方法,以优雅/简化的方式初始化和/或处理Array的所有元素,以避免代码重复: <HideModuleName>Public Module ArrayExtensions <Extension> Public Sub InitializeAll(Of T As New)(ByVal sender As T()) Fo 情景

我编写了这些扩展方法,以优雅/简化的方式初始化和/或处理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 SubEnd 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是一个接口,我试图删除类型参数的“As New”但仍然显示相同的错误.

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

我知道我可以在下面的单个方法中融合/合并两种方法的逻辑:

<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 indexEnd Sub

但是我更喜欢使用两种不同的方法,因为当我没有传递一次性对象数组时,我获得了性能,避免了额外的检查.

解决方法 这里真正的问题是当一个对象有一个Constructor并且也是Idisposable时会发生什么?请问哪种方法?这就是它导致问题的原因.

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

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

'Would mean you can dispose them,but you have to load the method with ReflectionPublic 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:方法’X’具有多个具有相同签名定义全部内容,希望文章能够帮你解决.net – IDisposable:方法’X’具有多个具有相同签名的定义所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1212924.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存