gpt4 book ai didi

c# - 为什么常量可以隐式转换而静态只读字段不能?

转载 作者:IT王子 更新时间:2023-10-29 04:34:07 24 4
gpt4 key购买 nike

鉴于下面的代码,我想知道为什么 referenceValue = ConstantInt; 有效而 referenceValue = StaticInt; 编译失败。

namespace Demo
{
public class Class1
{
private const int ConstantInt = 42;
private static readonly int StaticInt = 42;

public void DemoMethod(ref uint referenceValue)
{
referenceValue = ConstantInt; // This compiles
referenceValue = StaticInt; // This claims that the source type 'int' cannot be converted to 'unit' implicitly.
}
}
}

最佳答案

常量在编译时被替换为它们各自的值。所以从编译器的角度来看,这个 referenceValue = ConstantInt; 和这个 referenceValue = 42 是一样的。

虽然 readonly 字段感觉相似,但事实并非如此。它们的值在编译时并不真正为人所知。它们由类中的静态字段支持。它们的值可以计算,甚至可以从静态构造函数修改,因此编译器无法在编译时检查该值是否在 uint 的范围内。

例如:

public class Class1
{
private const int ConstantInt = 42;
private static readonly int StaticInt = 42;

static Class1()
{
StaticInt = -20;
}

public void DemoMethod(ref uint referenceValue)
{
referenceValue = StaticInt; // it's -20
}
}

编辑

正如评论中指出的,并非所有从常量到变量的赋值都有效,long 常量到 int 变量在没有显式转换的情况下不起作用。此行为基于常量的类型是相同的,无论它是命名常量还是内联常量:

private const long ConstantInt = 42;
// Both of these will cause an error:
referenceValue = ConstantInt; // can't be converted implicitly
referenceValue = 42L; // but neither can an inline long constant (the L makes it long)

关于c# - 为什么常量可以隐式转换而静态只读字段不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379279/

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