2016-04-13 9 views
0

を私はこれをしようとした場合:私はCヌル(c == null)その後、WriteLine()出力すべきヌルに等しい場合と言っていますはなぜ種類がで一致している必要があります:三項条件演算子

// As an example. char? c value is actually given by the user. 
char? c = null; 

WriteLine((c == null) ? "null" : c); 

コンソールに接続します。それ以外の場合は、cの値を出力する必要があります。

は、しかし、私はこのコンパイラエラーを取得:

「文字列」と文字の間には暗黙的な変換が存在しないため、条件式のタイプを決定することはできません?。

char? c = null;    
WriteLine((c == null) ? "null" : "{0}",c); 

または、ここに似たコンパイルエラーにより読み込みC#6と使用文字列の補間

char? c = null;    
WriteLine((c == null) ? "null" : $"{c}"); 

とでstackoverflowの例:

私の問題を回避するには、これを実行することでした

Type of conditional expression cannot be determined because there is no implicit conversion between 'int' and <null>

または

Type of conditional expression cannot be determined because there is no implicit conversion between 'string' and 'System.DBNull'

理由は、型が一致しなければならないであることを通知します。私の質問は、型が一致する必要がある理由です。また、エラーは文字列とcharの間に暗黙の変換がないと言うので、文字列のcharへの明示的な変換があることを意味しますか? (これは明らかにロジックではここではできません)、またはcharからのものであることを意味しますか?文字列に?

答えて

2

コンパイラは、式の型が何であるかを知る必要があります。 文字と文字へのポインタは同じものではありません。

意味は分かりますが、コンパイラはすべての式に型を割り当てる必要があるため、WriteLineサブルーチンのどのバージョンが呼び出されるかはわかります。 実行時にその決定を延期することはできません。コンパイル時に決定する必要があるため、三項式がどのような型かを知る必要があります。

+0

ありがとう、もう少し説明できますか?私は文字列と文字について話していることをコンパイラが知っているようです。 – Johnson

+0

@ GeoOscStephan、コンパイラが選択する 'WriteLine'のオーバーロードが混乱しています。 –

+0

@KirkWollどのような過負荷ですか?コンパイラが最初の式を選択し、それがヌルであればそれを出力し、それ以外の場合は2番目の式を選択して出力する必要があります。 – Johnson

関連する問題