2016-05-16 3 views
-1

У меня есть небольшой кусок кода для рефакторинга. Кто-то писало отлито в таком стиле:Linq Exception on cast

list.OrderBy(u => (int)u.Original).First(); 

Иногда этот код бросок инвалидных Cast исключения (поле Original имеет типа object).

Пример:

list[0].Orginal = 200, 
list[1].Orginal = 85 

все ОК.

list[0].Orginal = 275452, 
list[1].Orginal = 154754 

Выдает Исключение

Кто-нибудь знает почему?

+1

Почему «Оригинал» типа «объект» в первую очередь?То вероятно, где вы должны быть рефакторинг – Sayse

+0

Зачем вам нужно использовать литые? – Satpal

+0

Кроме того, кроме описаний в примерах, я не вижу, как это может вызвать исключение, вы должны попытаться создать [mcve]. – Sayse

ответ

2

Поскольку он иногда выдает исключение исключений литых, это означает, что иногда у вас есть non-int типов экземпляров в вашем списке. Вы можете избежать их до кастинга, но это не очень хороший тип дизайна, я думаю.

Я бы сделал, как показано ниже, как быстрое исправление.

list.Where(u => u.Original is int).OrderBy(u => (int)u.Original).First(); 

Тогда я бы идти вперед и проверить, что я упускаю следующим образом:

list.Where(u => !(u.Original is int)).ForEach(u => Console.WriteLine(u.Original.GetType())) 

Затем закрепите list заранее.

+1

Я проверяю схему DB (этот список из процедуры DB), и кто-то меняет int на bigint и не меняет этот код. Большое спасибо за таргетинг на ответ. –

+1

Если теперь вы можете использовать большую базу данных в базе данных, вместо этого вы должны использовать длинные слова в своем коде. – iggymoran

1

Как и другие, рекомендуется избегать ненужного приведения. В вашем классе просто измените тип Orginal от object до int, и вам не понадобится приведение в запрос LINQ.

+1

Но для того, чтобы получить недопустимый листинг, что-то не должно быть целым. – Sayse

+0

Что делать, если список является только отфильтрованной версией другого списка, который действительно содержит 'object' - разные типы экземпляров? –

+0

Вы правы, и я не вижу, где его код может выкинуть это исключение ... – WPMed

-2

Код компилируется и запускается без проблем.

https://dotnetfiddle.net/dadrYJ

Они не являются Datatypes вы ищете

То, что вы на самом деле имел в виду

https://dotnetfiddle.net/ygJTyU

list[0].Orginal = 2147483647; 
list[1].Orginal = 154754; 

где п> 0

Учитывая, что. Ошибка довольно ясна.

Рефакторинг:

var value = int.MaxValue + n; 
list[0].Orginal = value; 

Рефакторинг:

int64 value = int.MaxValue + n; 
list[0].Orginal = value; 

Поэтому:

public int Lambda_OrderBy(Foo u) 
{ 
    return (int) u.Orginal; 
} 

Рефакторинг:

public int Lambda_OrderBy(Foo u) 
{ 
    int64 value = u.Orginal; 
    return (int) value; // FAIL! 
}