This compiles:
string s = "my string";
unsafe
{
fixed (char* ptr = s)
{
// do some works
}
}
This does not:
string s = "my string";
unsafe
{
fixed (char* ptr = (char*)s)
{
// do some works
}
}
error CS0030: Cannot convert type 'string' to 'char*'
I cannot find the spot in the c# spec which allows the first syntax but prohibit the second. Can you help and point out where this is talked about?
It's in section 18.6 of the spec - the fixed
statement.
The relevant productions are:
fixed-statement:
fixed (
pointer-type fixed-pointer-declarators)
embedded-statementfixed-pointer-declarator:
identifier=
fixed-pointer-initializerfixed-pointer-initializer:
&
variable-reference
expression
You're trying to use the expression version. Now, while there isn't a normal "conversion as an expression* from string
to char *
, the spec calls out the string
case, saying that a fixed-pointer-initializer can be:
An expression of type
string
, provided the typechar*
is implicitly convertible to the pointer type given in the fixed statement. In this case, the initializer computes the address of the first character in the string, and the entire string is guaranteed to remain at a fixed address for the duration of the fixed statement. The behavior of the fixed statement is implementation-defined if the string expression isnull
.
So although it looks like you're just performing a normal variable declaration and using an implicit conversion from string
to char *
, you're really making use of a special case of what the expression in a fixed-pointer-initializer is allowed to be.
See more on this question at Stackoverflow