2010-10-28 40 views
0

我刚刚将我的C#代码转换为vb.net。它是例外。Vb.net异常

C#代码:

private static short[] muLawToPcmMap; 

decoded[2 * i + 1] = (byte)(muLawToPcmMap[data[i]] >> 8); 

VB代码:

decoded(2 * i + 1) = CByte(muLawToPcmMap(data(i)) >> 8) 

例外:

Arithmetic operation resulted in an overflow. 

我非常大的麻烦。请帮忙。

+0

你能告诉我们两种语言的“解码”变量的声明吗? – Matthieu 2010-10-28 17:31:13

+1

vb.net或以前的VB化身,其中数组是基于1而不是基于0的? – xcud 2010-10-28 17:31:15

+0

byte [] encoded = new byte [size * 2]; – Barun 2010-10-28 17:49:08

回答

7

您的代码导致您正在使用的数据类型发生溢出。

VB.NET的默认行为是检查算术运算,而在C#中是不检查算术运算。

添加checked声明在你的C#代码,看看它也会失败。

checked { 
    // do all your work here, any overflow will cause an exception 
} 

修复代码以停止溢出。正如我在下面的评论中提到的那样,算术溢出不一定被忽略。您在这里执行的操作会导致可能意想不到的结果,您应该为此明确编写代码(通过增加类型的大小或处理失败)。

你应该(IMO)做的绝对最后一件事是在你的项目属性,编译选项卡,高级编译器设置按钮,就是检查标记勾选“删除整数溢出检查”。我个人认为这是一个坏主意,我个人在C#中使用checked,只要我做的事情会使我的变量溢出。提前失败,经常失败。

+0

我需要修复vb.net代码。 – Barun 2010-10-28 18:26:19

+1

是的,你可以。 /修复它停止溢出/。我提到了checked关键字,因为你表示他们的行为不一样。 – 2010-10-28 18:28:11

+0

请不要介意。但你没有帮助我。 – Barun 2010-10-28 18:30:03

0

这是最有可能的是,你正试图转换的数量是ByteShort

参考范围之外:我注意到,你的C#代码不包含强制转换为短 link text

+0

但它在c中工作完美# – Barun 2010-10-28 17:26:56

+0

请尝试了解我知道c#但不知道vb.net。我甚至没有想到转换会导致问题。 – Barun 2010-10-28 17:27:51

+0

请给我一个解决方案这个代码的vb中的转换代码[解码[2 * i + 1] =(字节)(muLawToPcmMap [data [i]] >> 8);] – Barun 2010-10-28 17:29:02

0

,但你的VB.NET代码呢。这是可能演员阵容导致一个位转移到一个位,导致溢出。 (如果没有看到数据,就无法真正知道。)删除它。

+0

实际上,当我用转换器将其转换为不存在的时候。那也是同样的例外。 – Barun 2010-10-28 17:48:32

+0

请回复。我很麻烦。 – Barun 2010-10-28 17:53:15

+0

你能提供你试图转换的数据的样本吗? – 2010-10-28 17:53:59

1

检查您的

byte[] decoded = new byte[size*2]; 

翻译

Dim decoded As Byte() = New Byte(size * 2 - 1) {} 

与否,在vb.net,你最后一个元素的索引,而不是自身的大小声明数组。

根据您翻译的如何解码,你必须检查代码的其余部分,以使其适应您选择的版本。

+0

是的,转换器如你所述改变它。但在每种情况下,它都会给予例外。 – Barun 2010-10-28 18:18:49