【问题标题】:(C#) Why is this code not throwing a TypeInitializationException?(C#) 为什么这段代码没有抛出 TypeInitializationException?
【发布时间】:2019-07-30 01:02:34
【问题描述】:

我正在 .NET CF 3.5 环境中开发 C# Winform 应用程序。

我了解以下示例中发生了 TypeInitializationException。

static int [] ArrayB = new int [ArrayA.Length];
static int [] ArrayA = new int [] {1, 2, 3, 4};

这是因为在声明 ArrayB 时 ArrayA 为空。因此,如下图所示进行更改不会出错。

static int [] ArrayA = new int [] {1, 2, 3, 4};
static int [] ArrayB = new int [ArrayA.Length];

那么为什么下面的例子不抛出 TypeInitializationException 呢?

static int [] ArrayB = new int [len];
static int len ​​= 4;

ArrayB 在 len 之前声明。我认为应该发生错误,因为在声明 ArrayB 时 len 尚未初始化。

但是为什么没有出现错误呢?

【问题讨论】:

    标签: c# visual-studio-2008 compact-framework windows-ce .net-cf-3.5


    【解决方案1】:

    即使它没有抛出异常,ArrayB 的长度仍然为零(int 的默认值)。这是某人的解释:“意外值的原因可以在 C# 语言规范中找到。这是 C# 语法和用法的权威文档。该文档指定静态字段永远不能被视为未初始化的值。如果它们被访问在应用值之前,返回其数据类型的默认值。对于整数值,这是零。C#语言规范还告诉我们,当静态字段通过在其声明中应用值来初始化时,就像我们所做的那样上面,它们是按照它们在代码中出现的顺序设置的。这意味着在计算 ArrayB 值时,我们使用了两个未初始化的值,每个都产生零结果。欲了解更多信息:Doc

    【讨论】:

    • 谢谢。对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多