在固定语句中使用三元条件运算符
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;
}
主要目的是让子程序更加统一,并且有可能在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;
}