2010-10-28 37 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