什么是“object< object”的c#equiv?

时间:2013-06-06 12:36:09

标签: c# .net 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

不用担心。编译器吃它....并要求更多。但是在转换为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;
    }

编译器阻塞它并显示错误消息:

Cannot apply operator '<' with operands of object and object

那么,哟哟?

5 个答案:

答案 0 :(得分: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

回到你的代码,你可以在确认它们不是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;
}

(为了完整性,C# 4 has the dynamic keyword允许旧的VB代码的道德等价物,即将方法调度延迟到运行时。但是,我不认为这是最简单的解决方案,我通常更喜欢尽可能多地静态检查类型信息。)

答案 1 :(得分:2)

此页面解释&lt;运算符的行为(包括应用于两个对象时)。

http://msdn.microsoft.com/en-us/library/cey92b0t(v=vs.80).aspx(参见“使用关系比较运算符进行无类型编程”部分)。

像Konrad Rudolph建议的那样,将它翻译成C#的最好方法是使用IComparable但是,我想在你的情况下,你可以简单地使用Math.Min(),如果你要比较数字,因为它没有意义申请这个操作符到对象(VB编译它但引发异常,如上面的链接所示)。

答案 2 :(得分:2)

另一种方法是编写一个通用方法,您可以在其中强制实施IComparable类型。

   public object Min<T>(T A, T B)
      where T: IComparable
   {
      if (object.ReferenceEquals(A, DBNull.Value) | 
          object.ReferenceEquals(B, DBNull.Value))
         return DBNull.Value;
      return A.CompareTo(B) < 0 ? A : B;
   }

答案 3 :(得分:0)

在vb中,如果你有明确的off和严格关闭,编译器会吃很多东西。在c#中,就我所知,这样的事情并不存在。

答案 4 :(得分:0)

是的,您不能在对象上使用比较运算符。请确保将字符串作为参数传递。