2

私はこのコードを持っています:

static dynamic Mean (dynamic x, dynamic y)
{
  return (x + y) / 2;
}


static void Main()
{
  int x = 3, y = 5;
  Console.WriteLine (Mean (x, y)); //this is working
}

ただし、次の行は実行時に失敗します。

string s = Mean (3, 5); // Runtime error!

何故ですか ?

動的な値sで設定できないのはなぜですか?

Console.WriteLine (...) もしそうなら、なぜこの動的な値で実行に成功したのですか?

編集

もしそうなら、どうすればstring s = Mean (3, 5);仕事をすることができますか?

4

4 に答える 4

5

この場合、文字列変数に int 値を設定しようとしているためです。

Console.WriteLine.ToString()コンソールに書き込む前に自動的に行います。たとえば、これを試してください。

int x=5;
Console.WriteLine(x);
于 2012-05-03T08:54:37.580 に答える
3

静的に記述されている場合、コードは有効である必要があります。

dynamic を使用するということは、型チェックが実行時まで延期されることを意味します。あなたの場合、意味はintを返しています。そのため、正当でない文字列に int を割り当てようとしています。

タイプに関しては、コードと以下の平均の実装を使用したコードとの間に違いはありません

int Mean(int x, int y){
   return (x+y)/2;
}

以下のステートメントはコンパイルエラーになります

string s = Mean(3,5);

戻り値の型として dynamic を使用し、x と y の型を使用することで、型をチェックせず、型チェックをランタイムに任せるようコンパイラに指示しただけです。サンプル コード内のチェックは、コンパイラによって実行されるものと基本的に同じであり、結果も同じです。譲渡は違法です。

Console.WriteLineint を取るオーバーロードがあるため、型チェックは成功し、その場合はすべて問題ありません

于 2012-05-03T08:59:14.147 に答える
1

Console.WriteLine は、オブジェクトの ToString() メソッドを呼び出します。実行時に、int である動的オブジェクトで ToString() を呼び出す場合、問題はありません。ただし、2番目の例では、本質的にintを文字列に入れようとしているため、不平を言っています。

これにより、やりたいことができるようになると思います。

string s = (Mean (3, 5)).ToString();
于 2012-05-03T09:02:04.207 に答える
0
dynamic s = Mean (3, 5); 

また

var s = Mean(3, 5);
于 2012-05-03T08:57:40.530 に答える