Dynamic 在C#中是否有与“动态”相当的锈迹?

Dynamic 在C#中是否有与“动态”相当的锈迹?,dynamic,rust,Dynamic,Rust,下面的C#代码可以翻译成Rust吗 动态x=109; x=“嗨”; 我需要一个通用的动态类型来创建一个动态值数组。例如: var l=新动态[2]; l[0]=102; l[1]=“你好”; 不是直接的。您只需为x创建一个新绑定即可: fn main() { let x = 109; let x = "Hi"; } 根据您的用例,您可能能够使用由特征或特征对象限定的泛型来实现类似的目标: use std::fmt::Display; fn main() { let

下面的C#代码可以翻译成Rust吗

动态x=109;
x=“嗨”;
我需要一个通用的动态类型来创建一个动态值数组。例如:

var l=新动态[2];
l[0]=102;
l[1]=“你好”;

不是直接的。您只需为
x
创建一个新绑定即可:

fn main() {
    let x = 109;
    let x = "Hi";
}
根据您的用例,您可能能够使用由特征或特征对象限定的泛型来实现类似的目标:

use std::fmt::Display;

fn main() {
    let mut x: Box<Display> = Box::new(109);
    x = Box::new("Hi");
}
使用std::fmt::Display;
fn main(){
让mut x:Box=Box::new(109);
x=框::新(“Hi”);
}
然而,委员会:

在编译时,假定类型为动态的元素支持任何操作


这对于特质对象是不正确的;trait对象只能用于trait中的显式方法。在我编写的代码中,我没有发现这是一个重大的障碍。一般来说,我要调用的方法数量是固定的,因此可以将这些方法映射到某个特征。在其他情况下,我可以提供一个通用类型,允许用户指定适合其情况的类型。

一个选项是使用向量(链接到beta,因为稳定文档没有显示为
任何
定义的方法,但它们是稳定的):

使用std::any::any;
fn main(){
让mut v:Vec=Vec![];
v、 推送(框::新(102usize));
v、 推送(盒子:新的(“Hi”);
适用于检验和确认中的项目{
//要做一个手术,有必要降低到
//具体类型
如果让某些(x)=项向下投射(参考::(){
println!(“num={:?}”,x)
}
}
}
请注意,与假定支持任何操作的
C#
中的
dynamic
相反,类型为
any
Box
)的值仅支持
any
Box
any
)中定义的操作。调用任何具体类型的方法都需要向下转换


我认为不可能有一种像生锈的C#的
dynamic
。要支持对动态值调用任何方法,必须有(完整的)运行时反射支持,Rust不提供这种支持


如果您知道将调用的方法,那么最好的选择是定义一个特征并使用
在这种情况下不需要任何

您的编辑将使其成为的副本。您真的需要允许任何类型,还是只允许类型的闭合联合(例如
int
string
)?啊,我正要更新这个。请注意,您不能向下转换到trait对象,因此您无法获得“任何可打印的类型”,例如。仍然不匹配
dynamic
,因为您不能调用任意方法。
use std::any::Any;

fn main() {
    let mut v: Vec<Box<Any>> = vec![];
    v.push(Box::new(102usize));
    v.push(Box::new("Hi"));

    for item in &v {
        // to do an operation, it is necessary to downcast to
        // a concrete type
        if let Some(x) = item.downcast_ref::<usize>() {
            println!("num = {:?}", x)
        }
    }
}