什么是“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
两个参数IComparable
为IComparable
,然后执行相应的操作:
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#这样的东西不存在。
是的,您不能在对象上使用比较运算符。 请确保将字符串作为参数传递。