我正在寫一個小VBA IDE插件,並有一個名爲AssertClass
一個COM可見的C#類,用AreEqual
方法是這樣的:如果我不想要類型安全?
public void AreEqual(object value1, object value2, string message = null)
{
if (value1.Equals(value2))
{
AssertHandler.OnAssertSucceeded();
}
else
{
AssertHandler.OnAssertFailed("AreEqual", message);
}
}
當客戶端VBA代碼調用像這樣,預期所有作品:
'@TestMethod
Public Sub TestMethod1()
'compares two identical Integer (Int16) values:
Assert.AreEqual 2, 2
End Sub
然而,當客戶端VBA代碼通過不同類型的,它失敗:
'@TestMethod
Public Sub TestMethod2()
'compares identically-valued Long (Int32) and Integer (Int16) values:
Assert.AreEqual CLng(2), 2
End Sub
當TestMethod2
通話Assert.AreEqual
,在.NET代碼接收int
和short
- 這是正確的......但我不想把它放在客戶端的VBA代碼上以確保它傳遞的是相同的類型 - 我希望所有這些調用導致成功的斷言:
Assert.AreEqual CByte(2), 2 'fails
Assert.AreEqual CInt(2), 2 'passes
Assert.AreEqual CLng(2), 2 'fails
Assert.AreEqual CSng(2), 2 'fails
Assert.AreEqual CDbl(2), 2 'fails
Assert.AreEqual CCur(2), 2 'fails
畢竟,VBA是沒有那麼嚴格的C#,當涉及到類型安全和平等檢查:
?CByte(2) = 2, CInt(2) = 2, CLng(2) = 2, CSng(2) = 2, CDbl(2) = 2, CCur(2) = 2
True True True True True True
我怎樣才能制定我AreEqual
C#功能,從而...不知何故避免強迫在VBA客戶端代碼中輸入安全性?我不能假設VBA客戶端代碼將傳遞數值 - 該方法還需要使用String
和Date
值。
我很難過。我唯一的選擇是證明類型的問題?
在VS 2013 Express中使用C#4.5。
不要帶走你想要完成的任何事情,也許這對你的設計完全不起作用,但爲什麼不用像'Assert.IsTrue()'這樣更通用的方法呢?然後你的VBA示例應該可以工作:'Assert.IsTrue(CByte(2)= 2)' – TyCobb 2014-11-05 03:47:17
@TyCobb AssertClass具有AreEqual,AreNotEqual,AreNotSame,AreSame,Fail,InConclusive ','IsFalse','IsNothing','IsNotNothing'和'IsTrue'方法。只有'AreEqual'(和'AreNotEqual')是有問題的;我忽略了其他的方法,以便brievety;) – 2014-11-05 03:49:33