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

如果静态编写,您的代码必须有效。

使用动态只是意味着类型检查被推迟到运行时。在您的情况下,意思是返回一个 int。因此,您试图将 int 分配给不合法的字符串。

从类型上看,您的代码与使用以下均值实现的代码之间没有区别

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

下面的语句会导致编译错误

string s = Mean(3,5);

通过使用动态作为返回类型和 x 和 y 的类型,您只是告诉编译器不要检查类型,而是将类型检查留给运行时。您的示例代码中的检查与编译器执行的检查基本相同,结果也相同。转让是非法的。

Console.WriteLine有一个采用 int 的重载,因此类型检查成功,在这种情况下一切正常

于 2012-05-03T08:59:14.147 回答
1

Console.WriteLine 调用对象的 ToString() 方法。在运行时,当您在动态对象(一个 int)上调用 ToString() 时,没有问题。但是,在您的第二个示例中,您实际上是在尝试将 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 回答