两个不同的枚举类型,例如:
public enum MyEnumA { A, B, C, }
public enum MyEnumB { X, Y, Z, }
在反射时
bool b = typeof(MyEnumB[]).IsAssignableFrom(typeof(MyEnumA[]));
b的值居然是true...
而无论csharp编译器,还是clr,都认为MyEnumA[]是无法转换成MyEnumB[]还有,上次那个非0为底的一维数组无法变成强类型估计也是ms的bug
真不知道ms的单元测试是怎么做的,这么低级的bug也会出现在Framework的release版本里面
让我白白浪费两天时间检查我Emit的IL是不是有什么bug,郁闷
public enum MyEnumA { A, B, C, }
public enum MyEnumB { X, Y, Z, }
在反射时
bool b = typeof(MyEnumB[]).IsAssignableFrom(typeof(MyEnumA[]));
b的值居然是true...
而无论csharp编译器,还是clr,都认为MyEnumA[]是无法转换成MyEnumB[]还有,上次那个非0为底的一维数组无法变成强类型估计也是ms的bug
真不知道ms的单元测试是怎么做的,这么低级的bug也会出现在Framework的release版本里面
让我白白浪费两天时间检查我Emit的IL是不是有什么bug,郁闷
作为开发工具
vs算是比较智能的
bug 多多 ,发现一个,记住一个 。
楼主可以给 微软写封信。
目前实现到下面的程度: public class ReferenceTypeA
{
public string Name { get; set; }
public ReferenceTypeA[] Children { get; set; }
} public class ReferenceTypeB
{
public string Name { get; set; }
public ReferenceTypeB[] Children { get; set; }
} [TestMethod]
public void ReferenceTypeAToReferenceTypeBTest()
{
EntityCopier copier = new ArrayCopierDecorator(EntityCopier.CreateAuto());
#region Init a
var a = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "1",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "1.1",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "1.1.1",
} ,
new ReferenceTypeA
{
Name = "1.1.2",
} ,
}
} ,
new ReferenceTypeA
{
Name = "1.2",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "1.2.1",
} ,
new ReferenceTypeA
{
Name = "1.2.2",
} ,
}
} ,
}
} ,
new ReferenceTypeA
{
Name = "2",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "2.1",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "2.1.1",
} ,
new ReferenceTypeA
{
Name = "2.1.2",
} ,
}
} ,
new ReferenceTypeA
{
Name = "2.2",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "2.2.1",
} ,
new ReferenceTypeA
{
Name = "2.2.2",
} ,
}
} ,
}
} ,
new ReferenceTypeA
{
Name = "3",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "3.1",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "3.1.1",
} ,
new ReferenceTypeA
{
Name = "3.1.2",
} ,
}
} ,
new ReferenceTypeA
{
Name = "3.2",
Children = new ReferenceTypeA[]
{
new ReferenceTypeA
{
Name = "3.2.1",
} ,
new ReferenceTypeA
{
Name = "3.2.2",
} ,
}
} ,
}
} ,
};
#endregion
ReferenceTypeB[] b = null;
copier.Copy<ReferenceTypeA[], ReferenceTypeB[]>(a, ref b);
#region Asserts
Assert.AreEqual(a[0].Name, b[0].Name);
Assert.AreEqual(a[0].Children[0].Name, b[0].Children[0].Name);
Assert.AreEqual(a[0].Children[0].Children[0].Name, b[0].Children[0].Children[0].Name);
Assert.AreEqual(a[0].Children[0].Children[1].Name, b[0].Children[0].Children[1].Name);
Assert.AreEqual(a[0].Children[1].Name, b[0].Children[1].Name);
Assert.AreEqual(a[0].Children[1].Children[0].Name, b[0].Children[1].Children[0].Name);
Assert.AreEqual(a[0].Children[1].Children[1].Name, b[0].Children[1].Children[1].Name);
Assert.AreEqual(a[1].Name, b[1].Name);
Assert.AreEqual(a[1].Children[0].Name, b[1].Children[0].Name);
Assert.AreEqual(a[1].Children[0].Children[0].Name, b[1].Children[0].Children[0].Name);
Assert.AreEqual(a[1].Children[0].Children[1].Name, b[1].Children[0].Children[1].Name);
Assert.AreEqual(a[1].Children[1].Name, b[1].Children[1].Name);
Assert.AreEqual(a[1].Children[1].Children[0].Name, b[1].Children[1].Children[0].Name);
Assert.AreEqual(a[1].Children[1].Children[1].Name, b[1].Children[1].Children[1].Name); Assert.AreEqual(a[2].Name, b[2].Name);
Assert.AreEqual(a[2].Children[0].Name, b[2].Children[0].Name);
Assert.AreEqual(a[2].Children[0].Children[0].Name, b[2].Children[0].Children[0].Name);
Assert.AreEqual(a[2].Children[0].Children[1].Name, b[2].Children[0].Children[1].Name);
Assert.AreEqual(a[2].Children[1].Name, b[2].Children[1].Name);
Assert.AreEqual(a[2].Children[1].Children[0].Name, b[2].Children[1].Children[0].Name);
Assert.AreEqual(a[2].Children[1].Children[1].Name, b[2].Children[1].Children[1].Name);
#endregion
}
bool c = typeof(MyEnumB).IsAssignableFrom(typeof(MyEnumA)); // false
bool c = typeof(MyEnumB).IsAssignableFrom(typeof(MyEnumA)); // false
bool b = typeof(uint[]).IsAssignableFrom(typeof(int[])); // trueuint[] array = new int[10]; //Error Cannot implicitly convert type 'int[]' to 'uint[]'uint[] array = (uint[])new int[10]; //Error Cannot convert type 'int[]' to 'uint[]'
Type c
)
参数
c
与当前的 Type 进行比较的 Type。返回值
如果 c 和当前 Type 表示相同的类型,或者当前 Type 位于 c 的继承层次结构中,或者当前 Type 是 c 所实现的接口,或者 c 是一个泛型类型参数并且当前 Type 表示 c 的约束之一,则为 true。如果这些条件都不成立,或者 c 为空引用(在 Visual Basic 中为 Nothing),则为 false。
bool b = typeof(string[]).IsAssignableFrom(typeof(int[])); // false
1.0,1.1没测试过
MyEnumB[] enumsB = (MyEnumB[])enums;
foreach (MyEnumB enumB in enumsB)
{
Console.WriteLine(enumB);
}
public enum MyEnumB { X, Y, Z, }编译后为...MyEnumA { '0', '1', '2', }
MyEnumB { '0', '1', '2', }不是.NET的bug...是lz的bug...