2014-08-27 4 views
3

Хиты, которые я получаю, когда я ищу ответ, относятся к отливке от short до int и от nullable до not-nullable. Тем не менее, я зациклился на том, как конвертировать из «большего» типа int? до "меньшего" типа короткий?.Как передать значение nullable int в значение nullable short?

Единственный способ, которым я могу думать о написании метода так:

private short? GetShortyOrNada(int? input) 
{ 
    if(input == null) 
    return (short?)null; 
    return Convert.ToInt16(input.Value); 
} 

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

+0

Что случилось с 'short? s = (short?) i; 'где' int? i = 5; '? –

+0

@JeroenVannevel См. [Мой комментарий к принятому ответу] (http://stackoverflow.com/a/25525926/1525840). Чтобы ответить на ваш вопрос - почти ничего не случилось с вашим предложением. Примите определенную помощь на моей стороне. –

ответ

11

Что не так с простым произведением? Я тестировал и это прекрасно работает.

private static short? GetShortyOrNada(int? input) 
{ 
    checked//For overflow checking 
    { 
     return (short?) input; 
    } 
} 
+1

+1 Короткий и простой, и он работает. – Maarten

+3

Gotta love "lifted" operator –

+0

Это неловко. Я использовал * (short?) FromDb ["field"] как int? *, И он не компилировался. Я забыл круглые скобки следующим образом: * (short?) (FromDb ["field"] как int?) *. Я чувствую себя как часть тела a.k.a. сидящего устройства ... –

1

Вы могли бы заменить условный оператор с условным выражением, например:

short? res = input.HasValue ? (short?)Convert.ToInt16(input.Value) : null; 
+1

Вам не нужен тройной, забрасывая значение «null» в значение с нулевым значением, оно просто даст вам «нуль». –

1

Это то, что вы ищете?

private short? GetShortyOrNada(int? input) 
{ 
    if(input == null) 
    return (short?)null; 
    if(input > Int16.MaxValue) 
    return Int16.MaxValue; 
    if(input < Int16.MinValue) 
    return Int16.MinValue; 
    return Convert.ToInt16(input.Value); 
} 

Я просто добавил предложения IF для случаев слишком больших значений.

Если вы просто хотите, чтобы вернуть нулевым значение, если значение не находится в требуемом диапазоне:

private short? GetShortyOrNada(int? input) 
{ 
    if(input == null || input < Int16.MinValue || input > Int16.MaxValue) 
    return (short?)null; 

    return Convert.ToInt16(input.Value); 
} 

Надеется, что это поможет.

+0

Не совсем то, что я ищу. Действительно, вы охраняете значения вне пределов * short * (+1 для этого), но я ищу встроенный подход, поэтому я ** не буду использовать метод. Пределы в моем конкретном случае всегда соблюдаются значениями, которые были уже до того, как я их получу. –

+0

Моя ошибка, я пропустил эту деталь и узнал из ответа, который вы приняли ;-) –

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