gpt4 book ai didi

c# - 为什么管理是否可以在有符号和无符号整数类型之间进行类型转换的规则如此不一致?

转载 作者:行者123 更新时间:2023-11-30 12:22:26 25 4
gpt4 key购买 nike

在 C# 中,在有符号和无符号整数类型之间进行转换的能力似乎受以下因素影响:

  1. 转换的是标量类型还是数组类型。
  2. 变量是否声明为对象

考虑以下代码示例:

// If the variable is declared as a byte array then type casting to sbyte[] results in a 
// compile-time error.
byte[] byteArray = new byte[2];
var c = (sbyte[])byteArray; // Compilation eror

// But if the variable is declared as an object then we neither get a compile-time nor a
// run-time error
object byteArrayObject = new byte[2];
var a = (sbyte[])byteArrayObject;

// With an explicitly typed scalar, the byte -> sbyte type conversion succeeds with no errors
byte scalarByte = 255;
var b = (sbyte)scalarByte;

// But if the scalar is declared as an object, an InvalidCastException is thrown at run-time
object byteObject = (byte)4;
var e = (sbyte)byteObject; // InvalidCastException

总结:

  • 声明为 byte[] 的数组:失败
  • 声明为对象的数组:成功
  • 声明为字节的标量:成功
  • 声明为对象的标量:失败

虽然此示例仅考虑字节,但相同的模式似乎也适用于其他整数类型。谁能解释为什么这些结果如此不一致?

最佳答案

第二种情况与有符号或无符号类型无关。您根本无法将值类型拆箱为不是其确切类型的东西。这也会失败:

object i = 1;
var l = (long)i; //Runtime expection: unboxing an int to a long

第一种情况是 C# 和 CLR 中允许的转换之间不幸的不匹配; C# 不允许值类型数组变化(同样,它比有符号和无符号类型更通用)。当从 object 进行强制转换时,编译器无法禁止它,因为它根本没有足够的信息来执行此操作,然后 CLR 会成功。

不过请注意,这只发生在值类型数组中。引用类型数组在 C# 中是变体(不幸的是):

var strs = new string[];
var objs = (object[])strs; //Compiles just fine.

这很不幸,因为它是一个 splinter 的方差;没有人阻止你这样做:

objs[0] = new object(); //Runtime exception, an object is not a string. Ouch!

同样有趣的是,接口(interface)和委托(delegate)中的 c# 泛型类型变化也不适用于值类型。关于为什么会这样的一个很好的解释可以在这里找到:here

关于c# - 为什么管理是否可以在有符号和无符号整数类型之间进行类型转换的规则如此不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40974227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com