C# 动态行为

本文关键字:动态 | 更新日期: 2023-09-27 18:33:05

我有这段代码:

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);工作?

C# 动态行为

因为在这种情况下,您正在尝试将 int 值设置为字符串变量。

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

int x=5;
Console.WriteLine(x);

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

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

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

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

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

string s = Mean(3,5);

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

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

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

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

string s = (Mean (3, 5)).ToString();
dynamic s = Mean (3, 5); 

var s = Mean(3, 5);