Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果我没有';我不想要类型安全?_C#_Vba_Com Interop_Equality_Type Safety - Fatal编程技术网

C# 如果我没有';我不想要类型安全?

C# 如果我没有';我不想要类型安全?,c#,vba,com-interop,equality,type-safety,C#,Vba,Com Interop,Equality,Type Safety,我正在编写一个小小的VBA IDE插件,其中有一个COM可见的C#类,名为AssertClass,其AreEqual方法如下: public void AreEqual(object value1, object value2, string message = null) { if (value1.Equals(value2)) { AssertHandler.OnAssertSucceeded(); } else { A

我正在编写一个小小的VBA IDE插件,其中有一个COM可见的C#类,名为
AssertClass
,其
AreEqual
方法如下:

public void AreEqual(object value1, object value2, string message = null)
{
    if (value1.Equals(value2))
    {
        AssertHandler.OnAssertSucceeded();
    }
    else
    {
        AssertHandler.OnAssertFailed("AreEqual", message);
    }
}

当客户端VBA代码这样调用它时,所有操作都按预期进行:

”@TestMethod
公共子测试方法1()
'比较两个相同的整数(Int16)值:
断言。等于2,2
端接头

但是,当客户端VBA代码传递不同类型时,它会失败:

”@TestMethod
公共子测试方法2()
'比较相同值的长(Int32)值和整数(Int16)值:
Assert.AreEqual CLng(2),2
端接头


TestMethod2
调用
Assert.AreEqual
时,.NET代码接收一个
int
和一个
short
-这是正确的。。。但我不想将其放在客户端VBA代码上,以确保它传递相同的类型-我希望所有这些调用都会导致后续断言:

Assert.AreEqual CByte(2),2'失败
Assert.AreEqual CInt(2),2'通道
Assert.AreEqual CLng(2),2'失败
Assert.AreEqual CSng(2),2'失败
Assert.AreEqual CDbl(2),2'失败
Assert.AreEqual CCur(2),2'失败
毕竟,VBA在类型安全和平等性检查方面没有C#严格:

CByte(2)=2,CInt(2)=2,CLng(2)=2,CSng(2)=2,CDbl(2)=2,CCur(2)=2 真的真的真的真的
我如何制定我的
AreEqual
C#函数以便。。。以某种方式避免在VBA客户端代码中强制使用类型安全性?我不能假设VBA客户端代码将传递数值-该方法还需要处理
String
Date

我被难住了。我唯一的选择是记录类型的重要性吗


在VS 2013 Express中使用C#4.5。

这有点像是在黑暗中拍摄的(VBA和C#组合不起作用),但试试看它是否有效:

public void AreEqual(object value1, object value2, string message = null)
{
    bool convertedOk = true;
    object value2Converted;

    try
    {
         value2Converted = Convert.ChangeType(value2, value1.GetType());
    }
    catch 
    {
         convertedOk = false;
    }

    if (convertedOk && value1.Equals(value2Converted))
    {
        AssertHandler.OnAssertSucceeded();
    }
    else
    {
        AssertHandler.OnAssertFailed("AreEqual", message);
    }
}
其思想是,您将第二个值的类型更改为第一个值的类型,以便它们现在变得“更兼容”,以便进行比较

编辑:
根据评论建议,使用try/catch处理更新了答案。谢谢

不要带走您试图完成的任何东西,也许这对您的设计根本不起作用,但是为什么不使用一个更通用的方法,比如
Assert.IsTrue()
?然后您的VBA示例应该可以工作:
Assert.IsTrue(CByte(2)=2)
@TyCobb
AssertClass
具有
AreEqual
arenequal
不相同
arame
不确定
为假
为零
isnothing
IsTrue
方法。只有
AreEqual
(和
AreNotEqual
)是有问题的;我省略了brievety的其他方法;)当然,转换它!(facepalm)…现在实际的修复需要一个
try/catch
块来确保转换确实是可能的,但这个答案肯定让我走上了正确的道路。谢谢有趣的答案。如果值2无法转换,这可能需要包装在一个try块中。注意:在仔细考虑之后,我将保持
AssertClass
方法类型安全。非常简单,没有副作用,也没有边缘情况。考虑<代码> Acess 300,CByte(30)<代码>与<代码> AreEqual CByte(30),300 < /代码> -一个吹,另一个通过。我甚至没有提到转换后的
布尔值会发生什么。。