gpt4 book ai didi

c# - 如果 Int32 只是 int 的别名,那么 Int32 类如何使用 int?

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:48 26 4
gpt4 key购买 nike

正在浏览 .NET Framework Reference Source 的 .NET 源代码, 只是为了好玩。并发现了一些我不明白的东西。

Int32.cs 文件包含 Int32 类型的 C# 代码。不知何故,这对我来说似乎很奇怪。 C# 编译器如何为 Int32 类型编译代码?

public struct Int32: IComparable, IFormattable, IConvertible {
internal int m_value;

// ...
}

但这在 C# 中不是非法的吗?如果 int 只是 Int32 的别名,它应该无法通过 Error CS0523 进行编译:

Struct member 'struct2 field' of type 'struct1' causes a cycle in the struct layout.

编译器有什么神奇之处,还是我完全偏离了轨道?

最佳答案

isn't this illegal in C#? If "int" is only alias for "Int32" it should fail to compile with error CS0523. Is there some magic in the compiler?

是的;该错误在编译器中被故意抑制。如果所讨论的类型是内置类型,则完全跳过循环检查器。

通常这种事情是非法的:

struct S { S s; int i; }

在这种情况下,S 的大小是未定义的,因为无论 S 的大小是多少,它都必须等于自身加上一个 int 的大小。没有这样的尺寸。

struct S { S s; }

在那种情况下,我们无法从中推断出 S 的大小。

struct Int32 { Int32 i; }

但在这种情况下,编译器提前知道 System.Int32 是四个字节,因为它是一种非常特殊的类型。

顺便说一下,C# 编译器(以及 CLR)如何确定一组结构类型何时循环的细节非常有趣。我会尝试写一篇关于此的博客文章。

关于c# - 如果 Int32 只是 int 的别名,那么 Int32 类如何使用 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25929903/

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