什么是"object <object"的c#equiv?

ris*_*ism 3 .net c# vb.net

我有一些非常古老的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)

那么,哟哟哟?

Kon*_*lph 6

该代码仅适用于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代码的道德等价物,即将方法调度延迟到运行时.但是,我不认为这是最简单的解决方案,我通常更喜欢尽可能多地静态检查类型信息.)