1

主要目的是使子程序更加统一,并有可能在 SET 赋值中根据 Variable 的值选择 struct 的字段。如果我用 fixed() 替换注释行上的当前 fixed(),我会收到错误 CS0212

为什么它不能工作 - 这是“C#4.0 的当前限制”还是原则上不能工作?

    enum ConnectSide {Left,Right}

    unsafe private void ConnectSubtreeToNewNode(int iNumNodeHeadSubtree, int iNumNewNode, ConnectSide Side)
    {
        //fixed (int* prtNode = (Side == ConnectSide.Left) ? &Tree[iNumNewNode].iLeftElement : &Tree[iNumNewNode].iRightElement )
        fixed (int* prtNode = &Tree[iNumNewNode].iLeftElement)
        {
            if (iNumNodeHeadSubtree != iNodeOFF)
            {
                *prtNode = iNumNodeHeadSubtree;
                Tree[iNumNodeHeadSubtree].iParentElement = iNumNewNode;
            }
            else
                *prtNode = iNodeOFF;
        }
    }

此外

        private Node[] Tree;
        //Main struct for BST
        public struct Node
        {
            public int Key;
            public int iLeftElement;
            public int iRightElement;
            public int iParentElement;
            public int iHeight;
            public int iBalance;
        }
4

1 回答 1

3

如此处所述,运算符&只能用于直接在固定语句初始化程序中获取未固定变量的地址。通过尝试&在三元运算符内部使用,您打破了使用&.

你可以做这样的事情:

    // first fix the variable that you want to make a change later on (Tree[iNumNewNode]).
    fixed (var lpTree = &Tree[iNumNewNode])
    {
        // here you can create the pointer you wanted using the ternary operator.
        int* ptrNode = (Side == ConnectSide.Left) ? &lpTree->iLeftElement : &lpTree->iRightElement;

        if (iNumNodeHeadSubtree != iNodeOFF)
        {
            *prtNode = iNumNodeHeadSubtree;
            Tree[iNumNodeHeadSubtree].iParentElement = iNumNewNode;
        }
        else
            *prtNode = iNodeOFF;
    }
于 2019-08-18T03:28:28.027 回答