我有这样的代码:
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);工作呢?
发布于 2012-05-03 08:54:37
因为在本例中,您试图将int值设置为字符串变量。
Console.WriteLine在编写控制台之前自动执行.ToString()操作。例如,试试这个。
int x=5;
Console.WriteLine(x);发布于 2012-05-03 08:59:14
如果静态编写代码,则代码必须是有效的。
使用dynamic简单地意味着类型检查被推迟到运行时。在您的情况下,意思是返回一个int。您可以尝试将int分配给不合法的字符串。
从类型上讲,您的代码与使用下面实现的
int Mean(int x, int y){
return (x+y)/2;
}下面的语句将导致编译错误。
string s = Mean(3,5);通过使用dynamic作为返回类型以及x和y的类型,您只是告诉编译器不要检查类型,而是将类型检查留给运行时。在示例代码中,检查与编译器执行的检查本质上是相同的,结果也是一样的。这项任务是非法的。
Console.WriteLine有一个重载,需要一个int,所以类型检查成功,在这种情况下一切都很好。
发布于 2012-05-03 09:02:04
Console.WriteLine调用对象上的ToString()方法。在运行时,当您对动态对象(即int )调用ToString()时,就没有问题了。但是,在您的第二个示例中,您实际上试图将int放入字符串中,这就是为什么它在抱怨。
我相信这会让你做你想做的事。
string s = (Mean (3, 5)).ToString();https://stackoverflow.com/questions/10428058
复制相似问题