2015-09-24 17 views
8

này biên dịch:Chuyển đổi chuỗi cú pháp con trỏ

string s = "my string"; 
unsafe 
{ 
    fixed (char* ptr = s) 
    {    
      // do some works 
    } 
} 

này không:

string s = "my string"; 
unsafe 
{ 
    fixed (char* ptr = (char*)s) 
    {    
      // do some works 
    } 
} 

CS0030 lỗi: Không thể chuyển đổi loại 'string' thành 'char *'

Tôi không thể tìm thấy vị trí trong số c# spec cho phép cú pháp đầu tiên nhưng cấm cú pháp thứ hai. Bạn có thể giúp đỡ và chỉ ra nơi này được nói về?

+0

Bạn không chắc chắn tại sao điều này lại bị giảm giá - trông giống như một câu hỏi hay đối với tôi; rõ ràng về những gì được mong đợi, rõ ràng về lỗi, vv Nhìn vào spec bây giờ. –

+0

Trong khi Jon đang xem thông số kỹ thuật, hãy để tôi chỉ cho bạn [khía cạnh triển khai thực hiện] (http://stackoverflow.com/a/32465407/3764814). Nói ngắn gọn: kiểu CLI * nằm * về con trỏ tới đối tượng 'string' và cho bạn con trỏ tới char đầu tiên của nó thay vào đó (nó cũng làm như vậy cho mảng). Các trường hợp đặc biệt trong thời gian chạy ;-) –

+2

@LucasTrzesniewski Tôi đã xem qua câu hỏi này trong khi nghiên cứu các triển khai khác nhau của 'string.GetHashCode()' khác với các phiên bản khác nhau của BCL và cũng khác nhau trong Mono. Trong * một số thực hiện * non zero 'RuntimeHelpers.OffsetToStringData' được thêm vào giá trị con trỏ trước khi xử lý. Điều này có nghĩa là có hay không nó trỏ đến ký tự đầu tiên phụ thuộc phiên bản. –

Trả lời

7

Trong phần 18.6 của thông số - tuyên bố fixed.

Các sản phẩm liên quan là:

cố định tuyên bố:
    fixed (con trỏ kiểucố định con trỏ-declarators)nhúng-tuyên bố

cố định -bộ khai báo con trỏ:
    định danh=cố định con trỏ-initializer

cố định con trỏ-initializer:
    &biến tham chiếu
    biểu

Bạn đang cố sử dụng phiên bản biểu thức. Bây giờ, trong khi có không phải là một "chuyển đổi bình thường như là một biểu * string-char *, spec gọi ra các trường hợp string, nói rằng một cố định con trỏ-initializer có thể là:

Một biểu hiện của Loại string, với điều kiện loại char* có thể chuyển đổi hoàn toàn thành kiểu con trỏ được đưa ra trong câu lệnh cố định.Trong trường hợp này, bộ khởi tạo tính địa chỉ của ký tự đầu tiên trong chuỗi, và toàn bộ chuỗi được đảm bảo duy trì ở một địa chỉ cố định Hành vi của câu lệnh cố định được xác định thực hiện nếu biểu thức chuỗi là null.

Vì vậy, mặc dù nó trông như bạn chỉ cần thực hiện một tuyên bố biến bình thường và sử dụng một chuyển đổi ngầm string-char *, bạn đang thực sự làm cho việc sử dụng một trường hợp đặc biệt của những gì biểu hiện trong một cố định -pointer-initializer được cho phép.

Các vấn đề liên quan