условное присвоение оператора с nullable типами <value>?

<pre><code>employeenumber = string.isnullorempty(employeenumbertextbox.text) ? null : convert.toint32(employeenumbertextbox.text), </code></pre><p>мне часто хочется сделать что-то подобное (<code>employeenumber</code> - это <code>nullable<int></code>, поскольку это свойство объекта dbml linq-to-sql, где столбец допускает значения null). к сожалению, компилятор считает, что "не существует неявного преобразования между" null "и" int "", даже если оба типа были бы допустимы в операции присваивания для обнуляемого int самостоятельно.</p><p>насколько я могу судить, оператор объединения с нулевым значением не является опцией из-за встроенного преобразования, которое должно происходить со строкой .text, если оно не равно нулю.</p><p>насколько я знаю, единственный способ сделать это - использовать оператор if и/или назначить его в два этапа. в этом конкретном случае я нахожу это очень расстраивающим, потому что я хотел использовать синтаксис инициализатора объекта, и это назначение было бы в блоке инициализации ...</p><p>кто-нибудь знает более элегантное решение?</p>

<p>проблема возникает из-за того, что условный оператор не смотрит, как значение используется (назначается в этом случае) для определения типа выражения - только значения true/false. в этом случае у вас есть <em> null </em> и <strong>int32</strong>, и тип не может быть определен (есть реальные причины его не могу просто предположить <strong>nullable <int32></strong>).</p><p>если вы действительно хотите использовать его таким образом, вы должны привести одно из значений к <strong>nullable <int32></strong>, чтобы c # мог разрешить тип:</p><pre><code>employeenumber = string.isnullorempty(employeenumbertextbox.text) ? (int?)null : convert.toint32(employeenumbertextbox.text), </code></pre><p>или же</p><pre><code>employeenumber = string.isnullorempty(employeenumbertextbox.text) ? null : (int?)convert.toint32(employeenumbertextbox.text), </code></pre>

<p>я думаю, что полезный метод может помочь сделать это чище.</p><pre><code>public static class convert { public static t? to<t>(string value, converter<string, t> converter) where t: struct { return string.isnullorempty(value) ? null : (t?)converter(value); } } </code></pre><p>затем</p><pre><code>employeenumber = convert.to<int>(employeenumbertextbox.text, int32.parse); </code></pre>

<p>хотя алекс дает правильный и проксимальный ответ на ваш вопрос, я предпочитаю использовать <code>tryparse</code>:</p><pre><code>int value; int? employeenumber = int.tryparse(employeenumbertextbox.text, out value) ? (int?)value : null; </code></pre><p>это безопаснее и заботится о случаях неправильного ввода, а также о вашем сценарии с пустой строкой. в противном случае, если пользователь введет что-то вроде <code>1b</code>, ему будет представлена страница с ошибкой с необработанным исключением, вызванным в <code>convert.toint32(string)</code>.</p>

<p>вы можете разыграть вывод convert:</p><pre><code>employeenumber = string.isnullorempty(employeenumbertextbox.text) ? null : (int?)convert.toint32(employeenumbertextbox.text) </code></pre>

<pre><code>//some operation to populate posid.i am not interested in zero or null int? posid = svcclient.getholidaycount(xdatefrom.value.date,xdateto.value.date).response; var x1 = (posid.hasvalue && posid.value > 0) ? (int?)posid.value : null; </code></pre><p>правка: краткое объяснение выше, я пытался получить значение <code>posid</code> (если его ненулевое <code>int</code> и значение больше 0) в varibale <code>x1</code>. мне пришлось использовать <code>(int?)</code> для <code>posid.value</code>, чтобы условный оператор не выдавал ошибку компиляции. просто fyi <code>getholidaycount</code> - это метод <code>wcf</code>, который может дать <code>null</code> или любое число. надеюсь, это поможет</p>