2014-09-24 84 views
14

Tôi đang xem sử dụng toán tử ?? (toán tử kết hợp rỗng) trong C#. Nhưng số documentation tại MSDN bị giới hạn.Nếu toán hạng bên trái đến ?? toán tử không phải là null, toán hạng bên phải có được đánh giá không?

Câu hỏi của tôi: Nếu toán hạng bên trái không phải là rỗng, toán hạng bên phải có bao giờ được đánh giá không?

+2

Tự mình thử: 'string s =" A "; Console.WriteLine ("Hello" ?? a.Substring (10)); ' – phoog

Trả lời

27

Như bao giờ hết, C# đặc điểm kỹ thuật là nơi tốt nhất để đi cho các loại điều này.

Từ phần 7,13 của (tôi nhấn mạnh) C# 5 specification:

Một rỗng coalescing biểu hiện của hình thức a ?? b đòi hỏi a là của một loại nullable hoặc kiểu tham chiếu. Nếu a là không null, kết quả của a ?? ba; nếu không, kết quả là b. Hoạt động chỉ đánh giá b nếu a không có giá trị.

Có thêm chi tiết xung quanh khi thực hiện bất kỳ chuyển đổi nào và hành vi chính xác, nhưng đó là điểm chính được đưa ra cho câu hỏi của bạn. Cũng cần lưu ý rằng toán tử kết hợp không đúng là kết hợp đúng, do đó, a ?? b ?? c được đánh giá là a ?? (b ?? c) ... có nghĩa là nó sẽ chỉ đánh giá c nếu cả haiab là rỗng.

+0

Cảm ơn không bao giờ nghĩ đến kiểm tra Spec –

+9

@AntarrByrd: * Luôn luôn * kiểm tra spec :) Thông số kỹ thuật C# là một trong những tốt nhất bằng văn bản I ' đã thấy, và đó là nguồn có thẩm quyền cho loại điều này. –

+0

Sự kết hợp của nhà điều hành này có thực sự có bất kỳ ảnh hưởng quan sát nào đối với hành vi của nó không? Tôi đang cố nghĩ về một trường hợp mà '(a ?? b) ?? c' sẽ hoạt động khác với 'a ?? (b ?? c) ', và tôi không thể nghĩ ra. – JLRishe

11

Tại sao không kiểm tra nó :)

void Main() 
{ 
    var leftOrRight = left ?? right; 
} 

public bool? left 
{ 
    get 
    { 
     Console.WriteLine ("Left hit"); 
     return true; 
    } 
} 

public bool right 
{ 
    get 
    { 
     Console.WriteLine ("Right hit"); 
     return true; 
    } 
} 

Và câu trả lời cho câu hỏi là no ... Giá trị thứ hai không nhận được đánh giá

2

Kiểm tra này ra. Nếu tên không phải là null, giao diện điều khiển hiển thị "MyName". Nếu đó là null, giao diện điều khiển chương trình "Gọi là" sau đó "Allo"

using System;   
public class Program 
{ 
    public static void Main() 
    { 
     string name = "MyName"; 

     Console.WriteLine(name??test()); 
    } 

    private static string test() 
    { 
     Console.WriteLine("Called"); 
     return "Allo"; 
    } 
} 
4

Từ đặc điểm kỹ thuật:

Một rỗng coalescing biểu hiện của hình thức â ?? b yêu cầu phải có loại hoặc kiểu tham chiếu không có giá trị. Nếu một là không null, kết quả của một ?? b là a; nếu không, kết quả là b. Phép toán chỉ đánh giá b nếu giá trị rỗng.

(Nhấn mạnh thêm)

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