首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c#动态行为?

c#动态行为?
EN

Stack Overflow用户
提问于 2012-05-03 08:52:16
回答 4查看 226关注 0票数 2

我有这样的代码:

代码语言:javascript
复制
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
}

但是,以下行在运行时失败:

代码语言:javascript
复制
string s = Mean (3, 5); // Runtime error!

那是为什么?

为什么不能用动态值来设置s

如果是这样的话,为什么Console.WriteLine (...)能够成功地运行这个动态值呢?

编辑

如果是的话,我如何使string s = Mean (3, 5);工作呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-05-03 08:54:37

因为在本例中,您试图将int值设置为字符串变量。

Console.WriteLine在编写控制台之前自动执行.ToString()操作。例如,试试这个。

代码语言:javascript
复制
int x=5;
Console.WriteLine(x);
票数 5
EN

Stack Overflow用户

发布于 2012-05-03 08:59:14

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

使用dynamic简单地意味着类型检查被推迟到运行时。在您的情况下,意思是返回一个int。您可以尝试将int分配给不合法的字符串。

从类型上讲,您的代码与使用下面实现的

代码语言:javascript
复制
int Mean(int x, int y){
   return (x+y)/2;
}

下面的语句将导致编译错误。

代码语言:javascript
复制
string s = Mean(3,5);

通过使用dynamic作为返回类型以及x和y的类型,您只是告诉编译器不要检查类型,而是将类型检查留给运行时。在示例代码中,检查与编译器执行的检查本质上是相同的,结果也是一样的。这项任务是非法的。

Console.WriteLine有一个重载,需要一个int,所以类型检查成功,在这种情况下一切都很好。

票数 3
EN

Stack Overflow用户

发布于 2012-05-03 09:02:04

Console.WriteLine调用对象上的ToString()方法。在运行时,当您对动态对象(即int )调用ToString()时,就没有问题了。但是,在您的第二个示例中,您实际上试图将int放入字符串中,这就是为什么它在抱怨。

我相信这会让你做你想做的事。

代码语言:javascript
复制
string s = (Mean (3, 5)).ToString();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10428058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档