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);
工作?
因为在这种情况下,您正在尝试将 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);