编译:
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中允许第一种语法但禁止第二种语法的地方。你能帮忙指出谈论这个问题吗?
答案 0 :(得分:7)
这是在规范的第18.6节 - fixed
声明。
相关的作品是:
固定语句:
fixed (
指针类型 fixed-pointer-declarators)
embedded-statement固定指针说明符:
标识符=
fixed-pointer-initializer固定指针初始化:
&
变量引用
表达
您正在尝试使用表达式版本。现在,虽然不是正常的“转换为表达式*从string
到char *
,但该规范会调出string
个案例,说是fixed-pointer-initializer可以是:
类型为
string
的表达式,前提是类型char*
可隐式转换为fixed语句中给出的指针类型。在这种情况下,初始化程序计算字符串中第一个字符的地址,并保证整个字符串在固定语句的持续时间内保持固定地址。如果字符串表达式为null
,则fixed语句的行为是实现定义的。
因此虽然看起来就像你只是执行一个普通的变量声明并使用从string
到char *
的隐式转换,但你真的在使用允许使用 fixed-pointer-initializer 中的表达式的特殊情况。