Câu trả lời:
Một tính năng mới trong C # 6.0 cho phép khai báo biến bên trong phương thức TryParse.
Biểu thức khai báo đã bị cắt khỏi C # 6.0 và không được vận chuyển trong bản phát hành cuối cùng. Bạn hiện không thể làm điều đó. Có một đề xuất cho nó trên GitHub cho C # 7 (cũng xem điều này để tham khảo trong tương lai).
Với bản phát hành chính thức của C # 7, mã sau sẽ biên dịch:
string s = "42";
if (int.TryParse(s, out var result))
{
Console.WriteLine(result);
}
Chỉ tình cờ phát hiện ra, trong vs2017, bạn có thể làm điều này cho ngắn gọn:
if (!Int64.TryParse(id, out _)) {
// error or whatever...
}
Đó là một tính năng mới từ C # 7, đây là một tính năng rất hay thường được sử dụng kết hợp với khớp mẫu. Tính năng này và nhiều tính năng khác được thông báo trong blog của nhóm C # Có gì mới trong C # 7.0 .
Điều mà nhóm cố gắng đạt được ở đây là mã linh hoạt hơn. Bạn có nhớ một số trường hợp trong đó danh sách các biến quá dài không sử dụng được không? Chỉ là một ví dụ nhanh:
int i;
Guid g;
DateTime d;
if (int.TryParse(o, out i)) { /*use i*/ }
else if (Guid.TryParse(o, out g)) { /*use g*/ }
else if (DateTime.TryParse(o, out d)) { /*use d*/ }
Thấy vấn đề? Thật vô ích khi có tất cả những biến số đó ngồi đó mà không làm gì cả. Số dòng có thể được cắt đôi bằng cách sử dụng C # 7:
if (int.TryParse(o, out int i)) { /*use i*/ }
else if (Guid.TryParse(o, out Guid g)) { /*use g*/ }
else if (DateTime.TryParse(o, out DateTime d)) { /*use d*/ }
Không chỉ số lượng dòng được giảm thiểu, cũng không có danh sách các biến không cần thiết trong phạm vi mà bạn không muốn có chúng. Điều này ngăn bạn sử dụng một biến mà bạn không có ý định sử dụng, nhưng biến đó hiển thị với bạn bây giờ.
Tính năng này cũng hữu ích với đối sánh mẫu trong các switch
câu lệnh, như trong mã này (có hành vi khác với mã trên!):
switch (o)
{
case int i: { /*use i*/ break; }
case Guid g: { /*use g*/ break; }
case DateTime d: { /*use d*/ break; }
}