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

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

那么,哟哟哟?

该代码仅适用于VB,因为您使用Option Strict Off 。 总的来说,这是非常糟糕的做法 。 好吧,正如你所说,这是旧代码。 在现代代码(无论是VB还是C#)中,您将使用generics或/和接口。 由于DBNull ,代码无法直接转换为generics,但这是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 

回到你的代码,你可以在确保它们不是DBNull之后简单地IComparable两个参数IComparableIComparable ,然后执行相应的操作:

 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有dynamic关键字 ,它允许旧的VB代码的道德等价物,即将方法调度延迟到运行时。但是,我不认为这是最直接的解决方案,我通常更喜欢尽可能多地静态检查类型信息。)

此页面解释了<操作符的行为(包括应用于两个对象时的情况)。

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

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

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

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

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

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