Sự hiểu biết của tôi về cú pháp nhúng chuỗi của PowerShell "$($object)"
luôn là $object
được truyền đến [System.String]
, gọi số $object.ToString()
. Tuy nhiên, tôi đã nhận thấy hành vi kỳ lạ này với lớp [DateTime]
bằng PowerShell 4.0 trên Windows 8.1.Lấy ngày tháng thành chuỗi so với ToString()
PS> $x = Get-Date
PS> $x.GetType() | select -ExpandProperty Name
DateTime
PS> $x.ToString()
2015-05-29 13:36:06
PS> [String]$x
05/29/2015 13:36:06
PS> "$($x)"
05/29/2015 13:36:06
Dường như "$($object)"
cung cấp cho các hành vi tương tự như đúc để chuỗi, nhưng được sản xuất rõ ràng là một kết quả khác nhau từ $object.ToString()
. $x.ToString()
phù hợp với định dạng ngày ngắn được đặt trong intl.cpl (yyyy-MM-dd). [String]$x
xuất hiện để sử dụng mặc định ở Hoa Kỳ. Có thể đây chỉ đơn giản là một lỗi trong lớp DateTime, nhưng tôi ngạc nhiên hơn khi các phương thức chuyển đổi một đối tượng khác nhau thành một chuỗi tạo ra các kết quả khác nhau. Các quy tắc để đúc một đối tượng vào một chuỗi là gì, nếu không gọi ToString()
? Lớp DateTime có phải là trường hợp đặc biệt do quá tải của nó là ToString(String)
không?
Tôi không có đủ câu trả lời ngay bây giờ, nhưng tôi đã nhận thấy rằng '.ToString()' không phải lúc nào cũng tạo kết quả tương tự như nhúng đối tượng vào chuỗi (tôi chưa thử nghiệm nếu nhúng luôn giống như đúc thành '[Chuỗi]'). Vì vậy, tất cả những gì tôi có thể nói là nó không giới hạn trong '[DateTime]'. – briantist
'.Tostring()' chấp nhận một đối số định dạng, vì vậy nếu bạn yêu cầu tính nhất quán, luôn luôn '.ToString() 'và cung cấp định dạng mong muốn của bạn. Trong khi đó, đồng ý rằng 'cast' chỉ nên gọi'. ToString() 'và chấp nhận bất cứ định dạng mặc định nào. Không chắc chắn lý do tại sao họ sẽ thực hiện nó theo bất kỳ cách nào khác. – johnjps111
[Có thể liên quan] (http://stackoverflow.com/q/14359053/1630171). Tôi nghi ngờ rằng việc đúc sử dụng en-US làm nền văn hóa mặc định theo cách nào đó. 'ToString()' OTOH sử dụng văn hóa hiện tại, như [tài liệu] (https://msdn.microsoft.com/en-us/library/k494fzbf%28v=vs.110%29.aspx). –