【发布时间】:2018-09-19 00:02:56
【问题描述】:
我正在为更大的整数开发自定义 Int/UInt 类。它们在赋值/转换/算术等方面工作得很好。但是,它暴露了 xunit 和 MSTest 发生的问题。
这是我的代码:
UInt240 x = 0x7fffffff;
Assert.Equal(0x7fffffff, x);
问题是,如果我在右侧提供无符号类型,并在左侧提供文字,它将将该文字解释为“int”(或可以保存该值的相关带符号类型),并且无法转换为无符号类型(因为 C# 不会将有符号隐式转换为无符号类型,而 xunit 正在尝试隐式转换为通用类型)。 MSTest 将允许它,将两者都解释为“对象”对象,但会出错,因为尽管值匹配,但类型不同。
通常情况下,原语也会发生同样的情况:
ulong x = 0x7fffffff;
Assert.Equal(0x7fffffff, x);
我可以做些什么来避免隐式转换(即:“Assert.Equal((ulong)0x7fffffff, x);”)?如果不得不在所有地方强制转换类型,代码会变得非常臃肿。
【问题讨论】:
-
您的 equals 实现如何在您的类型上工作?
x.Equals(0)有效吗?Assert.True(x.Equals(0));会是可接受的解决方法吗?在执行 Assert.Equals 之前,您是否有理由无法将 0 显式转换为自定义类型? -
听起来像定义一些对您的特定类型具有重载的断言方法将是最简单的解决方案。例如
AssertInt.Equal(UInt160, UInt160); -
我更新了问题以表明行为不是我所做的,但即使使用内置原语也会发生。如果可能的话,我想减轻这种情况。 @mikez 你是对的,但如果我有更好的选择,我宁愿不要简单。
标签: c# casting mstest implicit xunit