TryParse không có var param


93

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. Tôi có một số mã:

string s = "Hello";

if (int.TryParse(s, out var result))
{

}

Nhưng tôi nhận được lỗi biên dịch: nhập mô tả hình ảnh ở đây

Tôi đang làm gì sai? PS: trong cài đặt dự án C # 6.0 và .NET framework 4.6 được thiết lập.

Câu trả lời:


152

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).

Cập nhật (07/03/2017)

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);
}

4
Cảm ơn rất nhiều cho thông tin! Thật đáng tiếc khi nó đã bị cắt khỏi bản phát hành cuối cùng, đối với tôi đó là một tính năng hay.
Anton23

2
@ Anton23 Hãy hy vọng nó được vào C # 7 rồi :)
Yuval Itzchakov

2
Đó là tính năng được mong đợi nhất đối với tôi.
Tuyền Phạm

Ít nhất là trong C # 7 / VS2017.
ssmith

1
Bạn không thể đọc tiếp, theo nghĩa đen, một câu nữa? Câu trả lời, trạng thái C # 7, cũng giải thích rằng nó đã bị cắt từ 6.0. Mọi người vẫn phát triển trong C # 6.0
Fus Ro Dah

15

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...
}

2
Đó là toán tử loại bỏ.
Patrick Hofman

9

Đó 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 switchcâ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; }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.