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,它会影响再次计算的方式。