65
EmployeeNumber =
string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : Convert.ToInt32(employeeNumberTextBox.Text),

私はよくこのようなことをしたいと思っています(これEmployeeNumberNullable<int>、列がNULL値を許可するLINQ-to-SQL dbmlオブジェクトのプロパティであるためです)。残念ながら、コンパイラはそれを感じています

'null'と'int'の間に暗黙の変換はありません

どちらの型も、それ自体でnull許容整数への代入演算で有効ですが。

nullでない場合は文字列でインライン変換を行う必要があるため、null合体演算子を使用することは私が見る限りのオプションではありませ.Textん。

私の知る限り、これを行う唯一の方法は、ifステートメントを使用するか、2つのステップで割り当てることです。この特定のケースでは、オブジェクト初期化構文を使用したかったので、非常にイライラします。この割り当ては初期化ブロックに含まれます...

よりエレガントな解決策を知っている人はいますか?

4

6 に答える 6

77

問題が発生するのは、条件演算子が式の型を決定するために値がどのように使用されているか (この場合は割り当てられているか) を調べないためです。つまり、真/偽の値だけです。この場合、 と がnullありInt32、タイプを判別できません (単に と仮定できない本当の理由がありますNullable<Int32>)。

本当にこの方法で使用したい場合は、Nullable<Int32>C# が型を解決できるように、値の 1 つを自分自身にキャストする必要があります。

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? (int?)null
    : Convert.ToInt32(employeeNumberTextBox.Text),

また

EmployeeNumber =
    string.IsNullOrEmpty(employeeNumberTextBox.Text)
    ? null
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text),
于 2008-09-16T19:08:05.970 に答える
8

ユーティリティメソッドはこれをよりクリーンにするのに役立つと思います。

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);
    }
}

それから

EmployeeNumber = Convert.To<int>(employeeNumberTextBox.Text, Int32.Parse);
于 2008-09-16T19:20:49.920 に答える
6

アレックスはあなたの質問に対して正確で近位の回答を提供しますが、私は以下を使用することを好みますTryParse:

int value;
int? EmployeeNumber = int.TryParse(employeeNumberTextBox.Text, out value)
    ? (int?)value
    : null;

より安全で、無効な入力のケースと空の文字列のシナリオを処理します。それ以外の場合、ユーザーが次のようなものを入力する1bと、 で発生した未処理の例外を含むエラー ページが表示されConvert.ToInt32(string)ます。

于 2008-09-16T19:32:47.410 に答える
3

Convert の出力をキャストできます。

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text)
   ? null
   : (int?)Convert.ToInt32(employeeNumberTextBox.Text)
于 2008-09-16T19:05:30.080 に答える
1
//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;

EDIT:上記の簡単な説明、私はPosidvaribale で(nullintでなく、値が0より大きい場合)の値を取得しようとしていましX1た。条件演算子がコンパイル エラーをスローしないようにするために、(int?)onを使用する必要がありました。Posid.Value参考までに、または任意の数を与えることができる方法ですGetHolidayCount。それが役立つことを願っていますWCFnull

于 2015-04-24T15:31:30.957 に答える