【发布时间】:2014-10-28 15:58:59
【问题描述】:
我正在尝试将结构传递给 sub/void 以用数据填充它。在 C# 中,这样做可以很好地工作
[TestFixture]
public class Boxing
{
[Test]
public void BoxingValue()
{
var res = (object)new Test();
SomeVoid(res);
Assert.AreEqual(2, ((Test)res).Id);
}
public static void SomeVoid(object b)
{
var f = b.GetType().GetField("Id");
f.SetValue(b, 2);
}
public struct Test
{
public int Id;
}
}
这段代码在 vb thoug 中通过了 C# 中的测试
<Test> Public Sub StructTest()
Dim s As Object
s = CObj(New Test)
A(s)
Assert.AreEqual(2, CType(s, Test).Id)
End Sub
Public Sub A(val As Object)
Dim f = val.GetType().GetField("Id")
f.SetValue(val, 2)
End Sub
Public Structure Test
Public Id As Integer
End Structure
有人对此有解释吗..
奇怪吗?
【问题讨论】:
-
我不明白。发布完整代码。
res的类型是什么? -
是的,如果没有C#中
res的声明,就无法判断代码转换是否正确。您需要缺少的两行 -Dim s As Object和s = CObj(New Test)。 -
能否在 C# 代码中也包含
<Test> Public Sub StructTest()并确保所有类名和变量名一致?void a(b)和A(val),还有struct DtoStruct与Structure Test。 -
这段代码看得我眼花缭乱。可变结构...将 C# 转换为 VB...使用拳击的副作用...反射...嘎!
-
@PEtter:即便如此,实际受行为差异影响的实际代码仍然被破坏。至于解释,我认为与其在这里发布,最好的办法是查看 IL(请参阅 ildasm.exe,或 dotPeek 或 Reflector 之类的工具)并查看每个编译器生成的内容。我不知道为什么 VB.NET 会以不同的方式处理盒装结构,但答案在 IL 中。