2008-09-16 17 views
47
EmployeeNumber = 
string.IsNullOrEmpty(employeeNumberTextBox.Text) 
    ? null 
    : Convert.ToInt32(employeeNumberTextBox.Text), 

私は頻繁に(それは列がNULL値を許可LINQツーSQL DBMLオブジェクトのプロパティだとしてEmployeeNumberNullable<int>である)私自身は、このようなことをやりたいと思っ見つけます。残念ながら、コンパイラは、「nullとintの間に暗黙的な変換はありません」と感じています。どちらの型もnullを許容するintへの代入操作では有効ですがNullableの条件付き演算子代入<value>タイプ?

NULLでない場合は、.Text文字列で実行する必要があるインライン変換のため、ヌル結合演算子はオプションではありません。

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

もっと洗練されたソリューションを知っている人はいますか?

+1

Eric Lippertの関連するブログエントリをチェックしてください:[タイプ推論の不具合、パート1](http://blogs.msdn.com/ericlippert/archive/2006/05/24/type-in​​ference-woes-part -one.aspx) – CodesInChaos

+0

[コンパイラエラー** CS0173 **](http://msdn.microsoft.com/en-us/library/vstudio/hb47kt2f%28v=vs.120%29.aspx)ここに私を連れて来ました。 – DavidRR

答えて

60

条件演算子は、値が式のタイプを決定するために(この場合は割り当てられて)使用されている方法を見ていないため、問題が発生しました - - 真偽値のみ。このケースでは、ヌルのInt32を持っている、とタイプが(それだけでnull許容のInt32 > <を負いかねます本当の理由がある)を決定することはできません。

本当にこの方法でそれを使用したい場合はC#がタイプ解決することができますので、あなたは、のNullable <のInt32 >に自分自身を値のいずれかをキャストする必要があります。

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

または

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

'new int?()'と書くこともできます。 – SLaks

+6

Nullableと仮定できない本当の理由があると言う何故? – BlueMonkMN

+1

@SLaksまたは 'default(int?)'です。 – IllidanS4

3

あなたは変換の出力をキャストすることができます

EmployeeNumber = string.IsNullOrEmpty(employeeNumberTextBox.Text) 
    ? null 
    : (int?)Convert.ToInt32(employeeNumberTextBox.Text) 
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); 
+0

これは本当に良いアイデアです。ジェネリックメソッドと拡張メソッドは非常に素晴らしいです: – Grank

6

アレックスは、あなたの質問に正しいと近位の答えを提供していますが、私はTryParseを使用することを好む:

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

それはより安全だと無効な入力の場合の世話をしますあなたの空の文字列のシナリオと同様に。そうでない場合、ユーザが1bのようなものを入力すると、処理されなかったエラーページがConvert.ToInt32(string)に表示されます。

+0

私は、ASP.NET CompareValidatorを使用してユーザーの入力を検証することを好みます。これは、DataTypeCheckの演算子とint型に設定できます。これは、入力が決して整数以外のものにならないことを保証し、可能ならばそれをクライアント側で行います。 – Grank

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:上記の 簡単な説明、私はvaribale X1に(intそのNULL以外の場合は0より大きい値を持つ)Posidの値を取得しようとしていました。条件付き演算子でコンパイルエラーが発生しないようにするには、(int?)Posid.Valueで使用しなければなりませんでした。 nullまたは任意の数値を指定できるWCFメソッドの場合は、FYI GetHolidayCountとなります。 役に立ったと思っています

+0

通常、コードをポストするのではなく、コードの内容を記述することをお勧めします。これは、質問をしている人(そして同じ問題を経験している間にこの質問を見つけた人)が、あなたの解決策が何をしているのかを理解するのに役立ちます。 –

+0

それを指摘してくれたRobertに感謝します。 – Sandeep