Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VB.NET中,是否不可能仅通过更改类型约束和返回类型来重载泛型方法?_Vb.net_Generics - Fatal编程技术网

在VB.NET中,是否不可能仅通过更改类型约束和返回类型来重载泛型方法?

在VB.NET中,是否不可能仅通过更改类型约束和返回类型来重载泛型方法?,vb.net,generics,Vb.net,Generics,我有两种几乎相同的方法: ''' <summary> ''' Converts a <see cref="DBNull"/> to an actual Nothing value. ''' </summary> ''' <typeparam name="T"></typeparam> ''' <param name="val"></param> '''

我有两种几乎相同的方法:

''' <summary>
''' Converts a <see cref="DBNull"/> to an actual Nothing value.
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="val"></param>
''' <returns></returns>
Public Shared Function DBNullToNull(Of T As Structure)(ByVal val As Object) As T?
    If TypeOf val Is DBNull Then Return Nothing Else Return Val
End Function

''' <summary>
''' Converts a <see cref="DBNull"/> to an actual Nothing value.
''' </summary>
''' <typeparam name="T"></typeparam>
''' <param name="val"></param>
''' <returns></returns>
Public Shared Function DBNullToNull(Of T As Class)(ByVal val As Object) As T
    If TypeOf val Is DBNull Then Return Nothing Else Return Val
End Function
“”
''将a转换为实际的无值。
''' 
''' 
''' 
''' 
公共共享函数DBNullToNull(属于T作为结构)(ByVal作为对象)作为T?
如果TypeOf val为DBNull,则不返回任何其他内容返回val
端函数
''' 
''将a转换为实际的无值。
''' 
''' 
''' 
''' 
公共共享函数DBNullToNull(属于T作为类)(ByVal作为对象)作为T
如果TypeOf val为DBNull,则不返回任何其他内容返回val
端函数
但我得到了这个编译错误:

公共共享函数DBNullToNull(属于T As结构)(val As Object)As T?'和“公共共享函数DBNullToNull(属于T As Class)(val As Object)As T”不能相互重载,因为它们仅在返回类型上有所不同

但它们的不同之处不仅在于返回类型,还在于泛型类型约束(一个用于结构,另一个用于类),它们是互斥的。这还是不允许的吗


当然,我可以重命名它们,这样它们就不会冲突,但那会有点烦人!还有其他方法吗?

我假设通用约束不是函数签名的一部分。Jon Skeet在C#的上下文中讨论了这一点(这里肯定是这样的情况):。我假设这是由.NET强加的,或者VB在这里做出了与C#相同的设计选择。在考虑时,请检查规则,编译器需要知道调用哪个方法。它怎么知道唯一的区别是返回类型?在这种情况下,区分泛型类型约束可能有效,但在其他情况下,一个对象可能满足多组约束。要对@jmcilhinney的注释进行一点扩展,这将是一个强有力的理由不允许它;据我所知,在现有的设计中,任何模棱两可的重载函数调用实例都可以通过对其中一个参数进行类型转换来解决,从而强制将其转换为一个候选函数。然而,如果存在约束歧义,则泛型约束的重载将不可能解决,因为无法将其强制到某个候选约束。