【问题标题】:Implicit Casting Issues (Integer literals)隐式转换问题(整数文字)
【发布时间】: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


【解决方案1】:

声明文字时,可以使用suffix 声明类型。这使您可以在没有强制转换的情况下指定文字的类型。

所以不妨试试这个:

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

【讨论】:

  • 我已经想到了这一点,这不是一个糟糕的答案,只是一直为有符号/无符号文字做这件事有点烦人。它本质上只是一种更清洁的铸造方式。我希望摆脱的那种。这似乎是语言设计方式的结果,所以我不能太沮丧,但我希望因为我控制类/变量,我可以做一些事情来指导这些情况下的行为。我假设不是。如果不是,我会接受这个答案,或者将 Assert 框架扩展为最明智的。对于最终用户来说,它们都有点恶心。
猜你喜欢
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多