【问题标题】:Using ternary conditional operator in fixed statement在固定语句中使用三元条件运算符
【发布时间】:2019-12-23 18:25:17
【问题描述】:

主要目的是使子程序更加统一,并且可以在SET赋值中根据Variable的值来选择struct的字段。 如果我用fixed() 替换注释行上的当前fixed(),我会收到error 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;
        }

【问题讨论】:

  • Tree的定义是什么?
  • C# 语言规范对在fixed() 的初始化程序中使用& 有特殊规则。见这里:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
  • 您可能想说CS0212是什么错误?所有的 C# 错误代码我都没有记住
  • @Flydog57 CS0212 - 您只能在固定语句初始化程序中获取未固定表达式的地址
  • @Dai Look Additional

标签: c# conditional-statements operator-keyword fixed ternary


【解决方案1】:

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

【讨论】:

  • 但是这个三元运算符在一个固定的语句初始化器中:) 你的解决方法很好,它非常接近原始想法。但问题也有理论部分 - 为什么它不起作用?这是“C#4.0 的当前限制”还是原则上不能工作?可以在新版本的 C# 中更改(理论上)吗?
  • @DenisSivtsov 我会说这是语言的不合理限制,因为编译器可以轻松处理您编写的代码。然而,似乎一个更好的地方来要求它的理由是 roslyn reposity:github.com/dotnet/roslyn/issues
  • @DenisSivtsov 如果您在 repo 中创建有关此问题的问题,请在此处链接,以便我们关注!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 2019-11-08
  • 2012-02-12
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多