C# 值类型如何包含自己类型的字段?

标签 c# floating-point primitive integral value-type

我试图了解更多关于如何在 C# 中实现和表示值类型的信息,当我看到 Single 结构/值类型定义如下时感到困惑:

public struct Single : IComparable, IComparable<Single>, IConvertible, IEquatable<Single>, IFormattable
{
    public const Single Epsilon = 1.401298E-45F;
    public const Single MaxValue = 3.40282347E+38F;
    public const Single MinValue = -3.40282347E+38F;
    public const Single NaN = 0F / 0F;
    public const Single NegativeInfinity = -1F / 0F;
    public const Single PositiveInfinity = 1F / 0F;

    // etc ...
}

Single 结构本身如何包含 Singles?或者换句话说,类型的定义如何包含该类型的实例?如果我尝试使用自己的结构执行此操作,编译器将返回错误。是不是实际的底层值是 C++ 原语,而“值类型”只是围绕它的方法集合? 我认为最终我对“原始”和“值类型”之间的区别感到困惑。如果它们是基元,为什么将它们定义为结构体?

最佳答案

如果您尝试这样做,编译器会提示您的结构无法成为 const(“类型‘MyStruct’无法声明为 const”)。

我问了一个similar question about decimal曾几何时。乔恩·斯基特 (Jon Skeet) 自己给出的答案是,mscorlib 的源代码中有些东西如果没有“一些有趣的 hack”,将无法按编写的那样进行编译。

我猜您遇到过其中一种。 Singlefloat 的同义词,它本身就是一个原始类型。源可能不是实际编译/CLR 类型的干净抽象。

关于C# 值类型如何包含自己类型的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58887409/

相关文章:

math - 为什么浮点运算在添加小数时不能给出准确的结果?

Objective-C 判断参数是否为对象

c# - .NET 基元和类型层次结构,为什么要这样设计?

c# - WinRT XAML 并以编程方式将焦点设置到 TextBox - 为什么焦点不固定?

c# - MongoDB 聚合管道 C#

floating-point - 了解 FMA 指令性能

java: boolean instanceOf boolean 值?

c# - 架构更改后,数据库不会重新初始化给本地订阅者

c# - 大表上的 T-SQL 和通配符字符串匹配性能

java - Java 模运算符的错误结果?