Tôi chỉ gặp tình huống này và tôi nghĩ đó là cơ hội tốt để sử dụng từ khóa mặc định. Nhưng nó không biên dịch và tôi không thể nghĩ tại sao. Ví dụ dưới đây minh họa vấn đề của tôi:So sánh loại chung với giá trị mặc định của nó, không có giới hạn lớp chung, cung cấp lỗi biên dịch
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result != default(TDataSource);
}
}
Bạn sẽ nhận được một lỗi trên dòng 8 (" '==' điều hành có thể không được áp dụng cho toán hạng của loại 'TDataSource' và 'TDataSource'."). Tôi nghĩ rằng việc sử dụng từ khóa mặc định sẽ loại bỏ bất kỳ vấn đề so sánh nào giữa các loại tham chiếu và loại giá trị.
Thêm ràng buộc chung hạn chế TDataSource vào loại tham chiếu làm cho đoạn mã này biên dịch.
Ai đó có thể giải thích tại sao trình biên dịch sẽ không khắc phục điều này cho tôi? Nó chỉ là không đủ thông minh để thấy điều này sẽ làm việc?
này liên quan: Can't operator == be applied to generic types in C#?
[Chỉnh sửa] SLaks câu trả lời cho tôi một số nguồn cảm hứng, các '==' nhà điều hành sẽ không làm việc, nhưng Equals chức năng nên.
public class Test<TDataSource>
{
public IQueryable<TDataSource> DataSource { get; set; }
public bool GetOneOrDefaultResult()
{
var result = DataSource.SingleOrDefault();
return result.Equals(default(TDataSource));
}
}
Biên dịch này có hoạt động chính xác không?
Nếu bạn đang cố gắng tìm ra nếu có kết quả, bạn đang làm sai bởi vì bạn sẽ không thể biết sự khác biệt giữa kết quả và kết quả là 0, – Gabe
Gabe logic của chức năng chỉ là một ví dụ, nó không hữu ích. – JJoos
Chỉnh sửa của bạn có thể ném NullReferenceExeption. Bạn cần gọi phương thức 'Equals (a, b)' tĩnh. – SLaks