Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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
C# 隐式强制转换问题(整数文本)_C#_Casting_Mstest_Implicit_Xunit - Fatal编程技术网

C# 隐式强制转换问题(整数文本)

C# 隐式强制转换问题(整数文本),c#,casting,mstest,implicit,xunit,C#,Casting,Mstest,Implicit,Xunit,我正在为更大的整数开发自定义Int/UInt类。它们在赋值/转换/算术等方面工作得很好。但是,它暴露了xunit和MSTest出现的一个问题 这是我的密码: UInt240 x = 0x7fffffff; Assert.Equal(0x7fffffff, x); 问题是,如果我在右侧提供一个无符号类型,在左侧提供一个文本,它将把文本解释为“int”(或可以保存该值的相关有符号类型),而不能强制转换为无符号类型(因为C#不会隐式地将有符号类型转换为无符号类型,而xunit正试图隐式转换为公共类型

我正在为更大的整数开发自定义Int/UInt类。它们在赋值/转换/算术等方面工作得很好。但是,它暴露了xunit和MSTest出现的一个问题

这是我的密码:

UInt240 x = 0x7fffffff;
Assert.Equal(0x7fffffff, x);
问题是,如果我在右侧提供一个无符号类型,在左侧提供一个文本,它将把文本解释为“int”(或可以保存该值的相关有符号类型),而不能强制转换为无符号类型(因为C#不会隐式地将有符号类型转换为无符号类型,而xunit正试图隐式转换为公共类型)。MSTest将允许它,并将两者解释为“object”对象,但会出错,因为尽管值匹配,但类型不同

基本体通常也会发生同样的情况:

ulong x = 0x7fffffff;
Assert.Equal(0x7fffffff, x);

我可以做些什么来避免隐式强制转换(即:“Assert.Equal((ulong)0x7fffffff,x);”)?如果必须到处强制转换类型,那么代码会非常臃肿。

当您声明一个文本时,您可以使用声明类型。它允许您在不使用强制转换的情况下指定文本的类型

所以不妨试试这个:

UInt240 x = 0x7fffffffUL;
Assert.Equal(0x7fffffffUL, x);

equals实现如何在类型上工作?x.equals(0)有效吗?将
Assert.True(x.equals(0));
是一个可接受的解决方法吗?在执行Assert.Equals之前,有没有理由不能显式地将0强制转换为自定义类型?听起来,为特定类型定义一些具有重载的Assert方法是最简单的解决方案。例如,
Assertent.Equal(UInt160,UInt160)
我更新了问题,以表明行为不是我做的,而是即使使用内置原语也会发生。如果可能的话,我想减轻这种情况。@mikez你是对的,但如果有更好的选择,我宁愿不使用simple。我已经想到了这一点,这不是一个坏答案,只是做所有这些事情有点烦人是时候使用有符号/无符号的文字了。这本质上只是一种更干净的施放方式。这是我希望摆脱的。这似乎是语言设计的结果,所以我不能太沮丧,但我希望既然我控制了类/变量,我可以做些什么来指导这些情况下的行为。我假设你不是如果不是的话,我会接受这个答案,或者扩展断言框架是最明智的。它们对最终用户来说都有点恶心。