Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
做一些类似VB的事情;变体";存在使用C#和#x27;什么是动态调度?_C#_.net_Dynamic_Variant - Fatal编程技术网

做一些类似VB的事情;变体";存在使用C#和#x27;什么是动态调度?

做一些类似VB的事情;变体";存在使用C#和#x27;什么是动态调度?,c#,.net,dynamic,variant,C#,.net,Dynamic,Variant,我意识到这与C#的强类型性质背道而驰,但我发现,在使用该语言中的动态对象时,JavaScript或PowerShell中常见的一些更有用的功能根本不实用 例如,下面的C#代码在运行时会失败,原因显而易见 dynamic x = 1.0; int y = x; 但这使得C#的动态特性在处理松散类型的数据(如JSON有效负载或CSV生成的数据)时非常有限,在这些数据中,表示形式的细微变化可能会导致运行时非常不同的行为 我要寻找的是一种类似于VBA/VBScript时代的变体类型的东西。我认为有可能

我意识到这与C#的强类型性质背道而驰,但我发现,在使用该语言中的动态对象时,JavaScript或PowerShell中常见的一些更有用的功能根本不实用

例如,下面的C#代码在运行时会失败,原因显而易见

dynamic x = 1.0;
int y = x;
但这使得C#的动态特性在处理松散类型的数据(如JSON有效负载或CSV生成的数据)时非常有限,在这些数据中,表示形式的细微变化可能会导致运行时非常不同的行为

我要寻找的是一种类似于VBA/VBScript时代的
变体
类型的东西。我认为有可能从
DynamicObject
派生出这样一种类型,它将封装原始值,如
Int32
String
等,并在运行时执行适当的强制转换。在动态上下文中使用“null”值

但这样的事情已经确定了吗?我环顾了GitHub或Codeplex,但没有找到任何结果,但这是一件很难找到的事情。在我开始学习我想象中的相当复杂的课程之前,我想确保我没有浪费时间

关于所有这些的实用性 我应该注意到,很长一段时间以来,我一直抵制C#中的动态调度概念,因为它不是一种动态语言。老实说,我希望它根本没有添加到语言中,或者至少只限于COM互操作场景

但话说回来,我一直很好奇如何“黑客”语言功能,让它们做一些他们从未打算做的事情。有时它会带来一些有用的东西。例如,有很多人使用
IDisposable
界面和
使用
语句来做与释放资源无关的事情


我怀疑我会在生产应用程序或任何需要交给另一个开发人员的东西中使用它。

visual basic语言隐藏了很多胶水,这不是C#方式。变量类型有大量转换函数,它们由vb运行时自动调用。NET也有自动转换函数,您只需显式使用它们:

dynamic x = 1.0;
int y = Convert.Int32(x);

用C#来解释必须编写这样的代码,因为它不是一种隐藏成本的语言。

老实说,我宁愿编写代码来将Json/Csv映射到强类型的数据模型类中,然后尝试用这样的东西蒙混过关。@asawyer-我大体上同意。这更像是一个“黑客”动态实验,目的是让它以有趣的方式运行。我可能不想在生产代码中这样做,因为我想在生产代码中呆上一段时间;写一个实现接口的容器类型。我在手机上,编辑/删除界面不起作用,所以我无法摆脱那个不好的评论!我的意思是从dynamicobject继承,然后你可以做你想做的所有疯狂的事情。只要你喜欢包装类型。链接:@AndrasZoltan-是的,这正是我想要做的。我只是不确定框架中或者像Json.net这样的成熟库中是否有任何东西已经解决了这个问题,那么我就不麻烦了。但至少我更有信心在我的帖子中正确地解释了我自己,因为这正是我想要表达的意思。我不太确定“隐藏成本”的论点(自动装箱…),我宁愿说原因是C#没有隐藏无法验证的断言。把一个
动态的
放进一个整数中,对程序的运行时行为提出了相当强烈的要求,而C#不想假装它可以证明这一点。