在 c# 中,隐式短到字节是不可能的,但在隐式 int 到短时没有问题。源值始终与目标范围一致

Posted

技术标签:

【中文标题】在 c# 中,隐式短到字节是不可能的,但在隐式 int 到短时没有问题。源值始终与目标范围一致【英文标题】:In c# implicit short to byte not possible but no issue while implicit int to short. Where source value is always with destination range 【发布时间】:2014-08-15 21:09:48 【问题描述】:

参考。回复您:“What happens when you cast from short to byte in C#?”

您说因为 short 是 2 个字节,而 byte 是 1 个字节,因此即使 short 值在字节范围内,它也不会隐式转换为字节。

那么 int 范围内的值是如何被隐式转换并存储的呢?

【问题讨论】:

Then how come with in range int value is implicitly converted and stored in int?。你的意思是converted and stored in short,对吧? 是的,先生,您是对的......!我已经为那个错字编辑了我的查询.. 我认为你需要提供一个例子。 int to short 没有隐式转换。 大多数基本示例 (short v = someIntVariable;) 无法编译 - “无法将类型 'int' 隐式转换为 'short'。存在显式转换(您是否缺少演员表?)”...绝对需要一个能说明问题的人。 在 MSDN 上查看“short” - msdn.microsoft.com/en-us/library/ybs77ex4.aspx。还请编辑您的帖子,以便清楚您到底想问什么(您在 cmets 中有许多问题变体)。 【参考方案1】:

Alexei Levenkov 在他最后的评论中引用了答案,但也许应该有一些进一步的解释:将文字分配给变量与从另一个变量分配值不同(特别是如果另一个变量也是另一种类型,这意味着隐式或显式转换)。

例如:

// The following statement defines a variable
// called 'integerValue' and assigns the
// 32 bit signed integer value fourty-two to 
// it because of the literal '42'.
int integerValue = 42;

// The next statement defines a variable
// called 'longValue' and assigns the
// 64 bit signed integer value forty-two to
// it because of the literal '42L'
long longValue = 42L;

// The next line defines a variable
// with the 16 bit signed integer value
// forty-two (literal '42') - the compiler
// will automatically interpret the literal
// in the correct format
short shortValue1 = 42;

// There is no implicit conversion between
// int and short, therefore the next statement
// will not compile. Notice that there is no
// literal involved here - instead a value from
// another variable is assigned. 
short shortValue2 = integerValue; // Error

// The following assignment is also not correct as
// '42L' is not a suitable literal for values of
// type short
short shortValue3 = 42L; // Error

主要是intshort 对文字使用相同的样式(纯数字,无后缀),这可能会让人感到困惑。

【讨论】:

+1。您也可以添加short shortValue3 = 42L;short shortValue4 = 0x1FFFF;,它们也会失败。 嗨,谢谢 feO2x !当您说“将文字分配给变量与从另一个变量分配值...”时,我很清楚我的疑问。 对不起,但是,我在您的回复中找到了另一个查询...为什么将文字分配给变量与从另一个变量分配值不同...那有什么区别... !如果你有时间的话,只是一个 lil 查询...... 如果将文字分配给变量,这会导致编译器将该特定值解释为某种类型并将其硬编码到程序集中。编译器可以执行此操作的编译时检查。另一方面,分配变量总是在运行时执行,因为编译器在执行分配时无法知道某个变量持有哪个特定值。 在本例中,如果您使用了 int 变量并将其值分配给 short 变量,那么您会看到显式转换错误(如上例所示) .但是,当您使用文字时(至少这是我的假设),您偶然发现 intshort 使用相同的文字样式(如我的回答中所述)。

以上是关于在 c# 中,隐式短到字节是不可能的,但在隐式 int 到短时没有问题。源值始终与目标范围一致的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb在隐式AND中发现方法混淆

它们在隐式 ctor、无参数空体 ctor 和显式默认 ctor 之间是不是等效?

自定义声明包含在隐式流中,但不包含在 PKCE 流中

Web Api 如何在隐式(或授权)授权流(OpenId)中验证令牌?

在隐式展开可选值时意外发现 nil (UICollectionView)

boost::any_cast - 仅在隐式转换不可用时抛出?