我有一些非常古老的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
那么,哟哟?
答案 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)
是的,您不能在对象上使用比较运算符。请确保将字符串作为参数传递。