4

誰かが私に次のコンパイラの問題を説明してもらえますか

エラー: 'string' と 'int' の間に暗黙的な変換がないため、条件式の型を特定できません

// WORKS
string text = string.Format(
    "the id is {0}", _Obj.Id.ToString());

// WORKS, without implicit conversion <<<
string text = string.Format(
    "the id is {0}", _Obj.Id);

// WORKS
string text = string.Format(
    "the id is {0}", (_Obj == null) ? "unknown" : _Obj.Id.ToString());

// NO WAY <<<
string text = string.Format(
    "the id is {0}", (_Obj == null) ? "unknown" : _Obj.Id);

最後の例では、暗黙的な変換もありません。

4

8 に答える 8

9

問題は、の使用法とは関係ありませんstring.Format。問題は次の式です。

(_Obj == null) ? "unknown" : _Obj.Id

intと の間に暗黙的な変換がないため、コンパイラはこの式の型を判別できませんstring。あなたはすでに解決策を見つけています - 呼び出しは、どちらの場合でもToString式が a を返すことを意味します。stringこれを修正する別の方法 (ただし、この場合はボックス化のために効率が若干低下します) は、コンパイラに変換の実行方法を明示的に伝えることです。たとえば、明示的なキャストをobject次のように使用できます。

(_Obj == null) ? "unknown" : (object)_Obj.Id

2 番目の例は、明示的なキャストがなくてもstring.Format機能objectintますobject

于 2010-11-15T11:43:09.087 に答える
5

Eric Lippert の Cast 演算子は分配法則に従わない

于 2010-11-15T11:50:52.370 に答える
2

この式が評価される型は何ですか?

(_Obj == null) ? "unknown" : _Obj.Id
于 2010-11-15T11:42:11.477 に答える
1

MSDN: Conditional Operatorからこれを読む必要があると思います 。

特にこの部分:

?: 演算子の 2 番目と 3 番目のオペランドは、条件式のタイプを制御します。X と Y を 2 番目と 3 番目のオペランドの型とします。それで、

X と Y が同じ型の場合、これは条件式の型です。それ以外の場合、X から Y への暗黙の変換 (セクション 6.1) が存在するが、Y から X への変換は存在しない場合、Y は条件式の型です。それ以外の場合、Y から X への暗黙の変換 (セクション 6.1) が存在するが、X から Y への変換は存在しない場合、X は条件式の型です。そうしないと、式の型を判別できず、コンパイル エラーが発生します。

于 2010-11-15T11:47:22.640 に答える
0
"the id is {0}", (_Obj == null) ? "unknown" : _Obj.Id

コンパイラーは、ピックstringタイプまたはinteger(推測) のいずれかを選択する必要があります。デフォルトでは、その逆を交換できます (暗黙の変換なし)。

string text = string.Format("the id is {0}", _Obj.Id)

string.Formatobjectarg として受け取るので、Id (整数) をオブジェクトに変換しても問題ありません。

于 2010-11-15T11:44:51.647 に答える
0

string.formatを受け入れるため、最後のものは機能(string, object)します。

? :演算子は一致する型を必要とするため、 最初の演算子は機能しません。

于 2010-11-15T11:45:21.153 に答える
0

問題はそれです

// WORKS, without implicit conversion 
string text = string.Format( 
    "the id is {0}", _Obj.Id); 

// NO WAY 
string text = string.Format( 
    "the id is {0}", (_Obj == null) ? "unknown" : _Obj.Id); 

同じではありません!

用語を考えてみてください

(_Obj == null) ? "unknown" : _Obj.Id);

なので

function int Eval(object obj)
{
  if (obj == null)
  {
    return "unknown";
  }
  else
  {
    return "1";
  }
}

これは明らかに機能していません。したがって、全体は とは何の関係もありませんstring.format

于 2010-11-15T11:48:56.510 に答える
-1

最初のケース (これは機能しません) の場合_Obj == nullは a を返しstring、それ以外の場合は an を返しますint。その場合、 to を割り当てようとするため、もちろん問題が発生しintますstring text

于 2010-11-15T11:41:16.387 に答える