Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串转换为指针语法_C#_.net - Fatal编程技术网

C# 将字符串转换为指针语法

C# 将字符串转换为指针语法,c#,.net,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 } }

这包括:

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*”


我找不到允许第一种语法但禁止第二种语法的地方。你能帮我指出这是在哪里讨论的吗?

它在规范的第18.6节-固定的
声明中

有关作品包括:

固定语句:
固定(
指针类型固定指针声明符
嵌入语句

固定指针声明符:
标识符
=
固定指针初始值设定项

固定指针初始值设定项:
&
变量参考
表情

您正在尝试使用表达式版本。现在,虽然没有将表达式*从
string
转换为
char*
,但规范调用了
string
案例,说明固定指针初始值设定项可以是:

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


因此,尽管看起来您只是在执行一个普通变量声明,并使用从
string
char*
的隐式转换,但您实际上是在利用一个特殊情况,即固定指针初始值设定项中的表达式是允许的。

不确定为什么会被否决-对我来说,这是一个好问题;清除预期内容,清除错误等。现在查看规范。当Jon查看规范时,让我向您展示。简言之:CLI类型与指向
字符串的指针有关,并为您提供指向其第一个字符的指针(对于数组也是如此)。运行时的特殊情况;-)@lucastrezesniewski我在研究
string.GetHashCode()的不同实现时遇到了这个问题
这在不同版本的BCL中是不同的,在Mono中也是不同的。在某些实现中,非零
运行时帮助程序。OffsetOstringData
在处理之前被添加到指针值。这可能意味着它是否指向第一个字符取决于版本。@zespri这很有趣。我对b感到惊讶它是通过隐式添加
offsetostringdata
我自己第一次(尽管这是有意义的),但如果这是版本相关的,那就…可怕了。@Lucastzesniewski在Mono中特别添加了
offsetostringdata
,但它似乎总是等于零。我想知道为什么。在一个无关的主题上,如果在.net 2.0.net 4.0和Mono中对同一字符串运行GetHashCode,你将得到3个不同的结果。从.net 4.5开始,你也有
UseRandomizedStringHashing
来自app.config,它会影响再次计算的方式。