【问题标题】:Using nullable integer to access array使用可为空的整数访问数组
【发布时间】:2015-07-15 16:16:42
【问题描述】:

我正在尝试在 C# 中实现二叉搜索树,并按照 Cormen 等人的第 12 章进行操作。为此,我需要使用可为空的类型,如下所示:

 public int insert(Node newNode) // return array index of added node
    {
        int? y = null;
        int? x = this.root;

        while (x != null)
        {
            y = (int)x;
            if (newNode.key < this.tree[x])
            { }

        }

        return 0;
    }

现在我收到以下错误:

不能隐式转换类型“int?”到'int'。 存在显式转换(您是否缺少演员表)?

为此if (newNode.key &lt; this.tree[x]) 线路。
使用可空类型访问数组索引是否违法?
我可以以不同的方式初始化数组以允许它吗?
或者我应该忘记 null 并使用 -1 例如?

【问题讨论】:

  • 参考Nullable types,确保不为空后尝试x.Value
  • 如果您想真正学习数据结构和算法,我建议您在非托管环境中进行此练习。
  • @aj.toulan:为什么?大多数(如果不是全部)常见算法都可以在托管环境中很好地实现。这样做的好处是,您可以专注于实际算法,而不必担心正确管理内存。
  • 我不明白为什么这个问题会得到 -1。 MSDN 文档没有明确说明是否可以使用可为空的 int 来访问数组索引,所以我认为这是一个合理的问题。如果我不是在这里学习,我显然不会问这个问题......
  • 我不知道他们为什么给你一个-1。但是要回答您的问题,.net 中的可为空类型实际上只是一个具有两个组件的结构,即实现的类型数据(在本例中为 int)和表示数据是否有效的 bool。数组的实现根本不知道可为空的 int 是什么,如果它为空,也不知道如何处理该值。就个人而言,我宁愿我的代码刹车进行转换,也不愿抛出一些异常,说这个值没有设置。它迫使程序员更多地思考他们想要什么。最后,它减少了技术债务。

标签: c# arrays types integer nullable


【解决方案1】:

你有x != null 约束,你只需要this.tree[x.Value]

目前尚不清楚y 的用途,但我怀疑您是否需要或想要(int) 演员。此外,tree[x]newNode.key 的类型也很重要。

使用可空类型访问数组索引是否违法?

是的

我可以以不同的方式初始化数组以允许它吗?

没有

或者我应该忘记 null 并使用 -1 例如?

这取决于。正确完成后两者都是可行的。

【讨论】:

  • 演员在那里,因为我正在尝试一些事情来修复该错误。确实不需要它,而且它现在不起作用。
【解决方案2】:

不能隐式转换类型“int?”到'int'。

你想比较一个int?到一个整数。编译器本质上是在说“如果 int 实际上为空,我应该如何处理这个比较?这是编译器无法解决的问题,因此您必须提供该逻辑。

换句话说,既然您已经防止 x 为空,请使用

this.tree[x.Value]

【讨论】:

    【解决方案3】:

    检查变量是否存在HasValue,如果存在则使用Value

    public int insert(Node newNode) // return array index of added node
        {
            int? y = null;
            int? x = this.root;
    
            while (x.HasValue)
            {
                y = x;
                if (newNode.key < this.tree[x.Value])
                {
                   //your logic here
                }
    
            }
    
            return 0;
        }
    

    【讨论】:

    • x != nullx.HasValue 完全一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多