在固定语句中使用三元条件运算符

Using ternary conditional operator in fixed statement

主要目的是让子程序更加统一,并且有可能在SET赋值select基于Variable值的struct字段。 如果我用 fixed() 替换注释行上的当前 fixed(),我会收到 error CS0212.

为什么不能用-是"current limitation of 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;
        }

如前所述here运算符&只能用于直接在固定语句初始值设定项中获取未固定变量的地址。通过尝试在三元运算符中使用 &,您打破了关于 &.

用法的前提

不过你可以这样做:

    // 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;
    }