2016-09-12 2 views
0

Convert.ToInt16 (строка ["INT"] как Int16?); возвращает 0 и (Int16) row ["INT"]; выбрасывает исключение. Указанный приказ недействителен.Указанное приведение недействительно при литье из int32 в int16

private DataTable GetTableWithValue() 
    { 

     DataTable dt = new DataTable(); 
     dt.Columns.AddRange(new DataColumn[] { 
      new DataColumn("INT", typeof(Int32)), 
      new DataColumn("STRING", typeof(string)), 
      new DataColumn("DATETIME", typeof(DateTime)), 
      new DataColumn("BOOLEAN", typeof(bool)), 
     }); 

     dt.Rows.Add(dt.NewRow()); 

     dt.Rows[0][0] = 10; 
     dt.Rows[0][1] = "Babu"; 
     dt.Rows[0][2] = DateTime.Now; 
     dt.Rows[0][3] = true; 
     return dt; 
    } 


     dt = GetTableWithValue(); 
     row = dt.Rows[0]; 


     int? INT = (row["INT"] as int?); //10 
     Int16? INT16 = Convert.ToInt16(row["INT"] as Int16?); //0 
     Int16 = (Int16)row["INT"]; //Specified cast is not valid. 
+0

если значение строки ["INT"] равно null, то (Int16) строка ["INT"] код не обрабатывается. Convert.ToInt16() принимает аргумент как объект и не будет вызывать нулевое вычисление – Prathyush

+1

Неправильная ли последняя строка? Int16 = (Int16) строка ["INT"]; // Указанный приведение недействительно. Я думаю, что это должно быть INT16 = (Int16) row ["INT"]; // Указанный приведение недействительно. – burzhuy

+0

если вы сделали 'Convert.ToInt16 (строка [" INT "] как int?)' Или даже просто 'Convert.ToInt16 (строка [" INT "]), ваша вторая строка сработала бы. это «как Int16» нарушает его. –

ответ

1

row["INT"] as Int16? возвращает null, когда либо при условии, значение в пределах строки является нуля, или когда значение из строки не литьевое к Int16 (например, если содержание было "zero"). Convert.ToInt16(null) теперь возвращается zero.

Однако «прямой» листинг (Int16) myValue выдает исключение, когда сбой выполняется. См. here для получения более подробной информации.

Во всяком случае, в вашем коде вы пытаетесь нарисовать Nullable<int> до Int16, что, очевидно, невозможно. Однако вы можете использовать nullables значение, который являетсяint:

Int16 result = ((int?)row["INT"]).Value; 

EDIT: Совершенно лучше Подход будет использовать TryParse который won't бросить исключение, если синтаксический анализ терпит неудачу, а просто возвращает false:

Int16 result; 
if (Int16.TryParse(row["INT"].ToString(), out result)) 
{ 
    // do something with result 
} 
Смежные вопросы