我有一些非常古老的VB.Net代码:
Private Function Min(ByVal A As Object, ByVal B As Object) As Object
If A Is DBNull.Value Or B Is DBNull.Value Then Return DBNull.Value
If A < B Then Return A Else Return B
End Function
Run Code Online (Sandbox Code Playgroud)
别担心.编译器吃它....并要求更多.但转换为C#时:
private object Min(object A, object B)
{
if (object.ReferenceEquals(A, DBNull.Value) | object.ReferenceEquals(B, DBNull.Value))
return DBNull.Value;
return A < B ? A : B;
}
Run Code Online (Sandbox Code Playgroud)
编译器扼杀它上面的错误信息:
Cannot apply operator '<' with operands of object and object
Run Code Online (Sandbox Code Playgroud)
那么,哟哟哟?
该代码仅适用于VB,因为您正在使用Option Strict Off.总的来说,这是非常糟糕的做法.好吧,正如你所说,这是旧代码.在现代代码(无论是VB还是C#)中,您将使用泛型或/和接口.代码不能直接转换为泛型,因为DBNull这里的泛型方法在VB中看起来像什么(没有DBNull检查):
Function Min(Of T As IComparable(Of T))(a As T, b as T) As T
Return If(a.CompareTo(b) < 0, a, b)
End Function
Run Code Online (Sandbox Code Playgroud)
回到你的代码,你可以简单地将两个参数强制转换为IComparable确保它们不是DBNull,然后做等效的:
private object Min(object A, object B)
{
if (A == DBNull.Value || B == DBNull.Value)
return DBNull.Value;
return ((IComparable) A).CompareTo(B) < 0 ? A : B;
}
Run Code Online (Sandbox Code Playgroud)
(为了完整起见,C#4有一个dynamic关键字,它允许旧的VB代码的道德等价物,即将方法调度延迟到运行时.但是,我不认为这是最简单的解决方案,我通常更喜欢尽可能多地静态检查类型信息.)