【发布时间】:2012-07-11 05:15:54
【问题描述】:
这是一个非常奇怪的问题,你可能会发现。 我正在做一个从 VB6 到 VB.NET 2010 的大型迁移项目。作为 VB6 的一部分,我们有一个常量定义为 NullString = "" 在 .NET 中,它也在类似的行上迁移并使用。 我们遇到的问题是,当将 RecordSet 中的值(它只是 DataTable 的一个包装器)与这个 NullString 进行比较时,我们会得到比较错误。 由于该项目正在积极开发中,我们必须依赖迁移工具(VB MIgration Partner),它了解很少的 Pragma 但不太先进。 我创建了一个类(NullStringClass)并重载了“=”和“”运算符,它对我的比较问题进行了排序。 但是在某些地方,我们有 someVar = NullString,其中 someVar 是一个字符串变量。现在,我收到无法从 NullStringClass 转换为字符串的错误。 我试图重载 ToString 方法并返回 "" 并在类上放置一个属性,如下所示:
<System.Reflection.DefaultMember("Value")> _
Public Class NullStringClass
属性定义为:
Public Property Value() As String
Get
Return ""
End Get
Set(ByVal value As String)
End Set
End Property
但它仍然抛出异常。 据我所知,这应该解决了我的问题,但没有运气。 我仍然得到同样的错误。 所以,我的问题是一样的。 有什么方法可以将该 NullString 变量转换为一个类并使用运算符重载进行不同的比较(包括 Null 和 Nothing),并且还可以用作对字符串变量的正常分配? 例如。意思是
Dim s as String
s = NullString
应该和下面的一样工作:
If rsData("MyField").Value <> NullString Then
'Note: rsData("MyField").Value is DbNull
这是运算符重载的示例(如果有人感兴趣)
Public Shared Operator <>(ByVal mmyVal As Object, ByVal objVal As NullStringClass) As Boolean
If TypeOf mmyVal Is String Then
Return (Not String.IsNullOrEmpty(mmyVal))
Else 'If TypeOf mmyVal Is Object Then
Return (Not IsDBNull(mmyVal))
End If
End Operator
谢谢, 尼克
【问题讨论】:
-
只是另一个想法。将 NullString 保持为字符串(不是写一个类),而是通过扩展方法为 String 类重载 运算符。有可能吗?
-
您正试图将 .net 转换为 VB6 沿着这条路线走下去,这在很多层面上都是个坏主意。最重要的是,“”不是空的,也不是 DBNull,使它们等价只是在延续无知。
-
该应用程序正在迁移,因为 Microsoft 已停止支持 VB6 :-) 另一个全新的 Web 应用程序正在取代这个应用程序。迁移此应用的唯一原因是让它再运行几年。
-
为什么不使用你的空字符串,而不是使用 String.Empty ?这是 .net 为此类目的提供的。
-
这就是 NullString 变量的值。但问题是当我将它与 DbNull 进行比较时,它会引发异常。因此,我需要一些类来处理 String 和 DbNull 即对象。请看我的回答:-)
标签: operator-overloading variable-assignment default-value assignment-operator