2013-08-14 2 views
2
private string getLngLat(string strLAC, string strCID) 
    { 
     string str; 
     try 
     { 
      HttpWebRequest length = (HttpWebRequest)WebRequest.Create(new Uri("http://www.google.com/glm/mmap")); 
      length.Method = "POST"; 
      int num = Convert.ToInt32(strLAC); 
      byte[] numArray = AjaxFrm.PostData(num, Convert.ToInt32(strCID)); 
      length.ContentLength = (long)((int)numArray.Length); 
      length.ContentType = "application/binary"; 
      length.GetRequestStream().Write(numArray, 0, (int)numArray.Length); 
      HttpWebResponse response = (HttpWebResponse)length.GetResponse(); 
      byte[] numArray1 = new byte[checked((IntPtr)response.ContentLength)]; // ERROR AT HERE 
      response.GetResponseStream().Read(numArray1, 0, (int)numArray1.Length); 
      if (response.StatusCode != HttpStatusCode.OK) 
      { 
       str = string.Format("Error {0}", response.StatusCode); 
      } 
      else 
      { 
       byte num1 = numArray1[0]; 
       byte num2 = numArray1[1]; 
       byte num3 = numArray1[2]; 
       if ((numArray1[3] << 24 | numArray1[4] << 16 | numArray1[5] << 8 | numArray1[6]) != 0) 
       { 
        str = ""; 
       } 
       else 
       { 
        double num4 = (double)(numArray1[7] << 24 | numArray1[8] << 16 | numArray1[9] << 8 | numArray1[10])/1000000; 
        double num5 = (double)(numArray1[11] << 24 | numArray1[12] << 16 | numArray1[13] << 8 | numArray1[14])/1000000; 
        str = string.Format("{0}&{1}", num5, num4); 
       } 
      } 
     } 
     catch (Exception exception) 
     { 
      str = string.Format("Error {0}", exception.Message); 
     } 
     return str; 
    } 

byte[] numArray1 = new byte[checked((IntPtr)response.ContentLength)];C# .NET IntPtr Недопустимый тип

здесь я получаю сообщение об ошибке с

Error 3 Cannot implicitly convert type 'System.IntPtr' to 'int'. An explicit conversion exists (are you missing a cast?)

Как прийти получите эту ошибку? как его решить?

+0

['IntPtr.ToInt32()'] (http://msdn.microsoft.com/en-us/library/vstudio/system.intptr.toint32.aspx)? –

+1

Вы уверены, что не имеете в виду 'long'? Это заставляет мои глаза кровоточить. –

+1

Почему вы выбрали 'ContentLength' для' IntPtr' в первую очередь? –

ответ

2

Просто укажите длину массива непосредственно, нет никакой необходимости, чтобы попытаться преобразовать в IntPtr первые:

byte[] numArray1 = new byte[response.ContentLength]; 

IntPtr типа предназначен только для хранения значений указателей, поэтому обычные правила для целочисленных типов не подать заявление. Значение указателя не является разумной длиной массива, поэтому разработчики языка не разрешали использовать длину IntPtr.

+1

u пропустил' checked'? –

+1

@ChinYe «checked» ничего здесь не добавляет, но если вы считаете иначе, отредактируйте свой вопрос, чтобы уточнить, почему вы думаете, что вам нужно, и я отредактирую свой ответ, чтобы обратиться к этому вопросу. – hvd

0

Если ваша цель состояла в том, чтобы преобразовать в int, вам просто нужно сделать это вместо:

byte[] numArray1 = new byte[checked((int)response.ContentLength)]; 

Это позволит избежать вы пытаетесь выделить больше 2 Гб для numArray1. Вам не нужно делать это с помощью компилятора . Хотя вы можете выделить массив, используя значение long для длины. Это просто, что он упадет во время выполнения, если размер достаточно большой. (В .NET 4.5 вы можете использовать настройки конфигурации приложения, чтобы для массивов с общим размером более 2 Гб, но я не уверен, навскидку ли что позволяет число элементов превышает int.MaxValue.)

Так на самом деле, вы бы лучше с оставив только проверку на CLR:

byte[] numArray1 = new byte[response.ContentLength]; 

... или если вы сделать хотите наложить какой-то максимальный размер, сделать это явно. (Я бы предложил максимум 2 ГБ, тоже ...)

Вы также должны учитывать возможность ContentLength, равную -1, что указывает на то, что клиент не указал ее в заголовке ответа.

Смежные вопросы