这编译:
string s = "my string";
unsafe
{
fixed (char* ptr = s)
{
// do some works
}
}
Run Code Online (Sandbox Code Playgroud)
这不是:
string s = "my string";
unsafe
{
fixed (char* ptr = (char*)s)
{
// do some works
}
}
Run Code Online (Sandbox Code Playgroud)
错误CS0030:无法将类型'string'转换为'char*'
我找不到c#规范中允许第一种语法但禁止第二种语法的地方.你能帮忙指出这里谈到的地方吗?
这是在规范的第18.6节 - fixed声明中.
相关的作品是:
fixed-statement:
fixed (指针类型 fixed-pointer-declarators)嵌入式语句fixed-pointer-declarator:
identifier=fixed-pointer-initializerfixed-pointer-initializer:
&变量引用
表达式
您正在尝试使用表达式版本.现在,虽然没有正常的"转换为表达式*from stringto char *,但规范调用了这个string案例,说固定指针初始化器可以是:
类型的表达式
string,前提是类型char*可以隐式转换为fixed语句中给出的指针类型.在这种情况下,初始化程序计算字符串中第一个字符的地址,并保证整个字符串在固定语句的持续时间内保持固定地址.如果字符串表达式是,则fixed语句的行为是实现定义的null.
所以,虽然它看起来像你只是执行正常的变量声明,并使用从隐式转换string到char *,你真的利用的东西在表达一种特殊情况的固定指针初始值设定为允许.
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |