将字符串转换为指针语法

时间:2015-09-24 19:50:37

标签: c# .net

编译:

string s = "my string";
unsafe 
{
    fixed (char* ptr = s)
    {               
          // do some works
    }
}

这不是:

string s = "my string";
unsafe 
{
    fixed (char* ptr = (char*)s)
    {               
          // do some works
    }
}
  

错误CS0030:无法将类型'string'转换为'char *'

我找不到c# spec中允许第一种语法但禁止第二种语法的地方。你能帮忙指出谈论这个问题吗?

1 个答案:

答案 0 :(得分:7)

这是在规范的第18.6节 - fixed声明。

相关的作品是:

  

固定语句
  fixed ( 指针类型 fixed-pointer-declarators ) embedded-statement

     

固定指针说明符
  标识符 = fixed-pointer-initializer

     

固定指针初始化
  & 变量引用
  表达

您正在尝试使用表达式版本。现在,虽然不是正常的“转换为表达式*从stringchar *,但该规范会调出string个案例,说是fixed-pointer-initializer可以是:

  

类型为string的表达式,前提是类型char*可隐式转换为fixed语句中给出的指针类型。在这种情况下,初始化程序计算字符串中第一个字符的地址,并保证整个字符串在固定语句的持续时间内保持固定地址。如果字符串表达式为null,则fixed语句的行为是实现定义的。

因此虽然看起来就像你只是执行一个普通的变量声明并使用从stringchar *的隐式转换,但你真的在使用允许使用 fixed-pointer-initializer 中的表达式的特殊情况。