2013-08-01 18 views
5

Gần đây tôi đã cài đặt Công cụ Hợp đồng Mã (Hợp đồng Mã cho .NET) và Mã Hợp đồng Editor Extensions VS2012, và tôi gặp một số vấn đề khi trình kiểm tra tĩnh hoạt động đúng.Mã Hợp đồng kiểm tra tĩnh dường như không biết về Contract.Ensures của ReadOnlyCollection <T> constructor

Khi tôi chạy kiểm tra tĩnh Mã Hợp đồng trên đoạn mã sau (với giả định thứ hai nhận xét ra)

using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Diagnostics.Contracts; 

public class TestClass 
{ 
    public ReadOnlyCollection<byte> Foo() 
    { 
     Contract.Ensures(Contract.Result<ReadOnlyCollection<byte>>().Count == 4); 

     IList<byte> list = new byte[4]; 
     Contract.Assume(list.Count == 4); 
     var returnValue = new ReadOnlyCollection<byte>(list); 
     //Contract.Assume(returnValue.Count == 4); 
     return returnValue; 
    } 
} 

tôi nhận được một 'đảm bảo chưa được chứng minh' đọc cảnh báo:

CodeContracts: Đảm bảo chưa được chứng minh: Contract.Result<ReadOnlyCollection<byte>>().Count == 4

Yêu cầu bảo đảm phương thức Foo chưa được chứng minh. Tuy nhiên, khi tôi chuột lên constructor của ReadOnlyCollection<T>, tôi có thể nói rằng Count tài sản của đối tượng xây dựng được đảm bảo là tương đương với Count tài sản của list tham số: Constructor mouseover

Đó là, kiểm tra tĩnh nên được có thể nói rằng returnValue.Count == 4 (nghĩa là đảm bảo của Foo) đúng. Nếu tôi uncomment giả định thứ hai, cảnh báo không biến mất, nhưng giả định rằng các đảm bảo của phương pháp của tôi giữ đúng rất nhiều thất bại mục đích của kiểm tra tĩnh.

Tôi nghĩ rằng vấn đề có thể là chỉ có phần mở rộng biên tập viên mới biết về hợp đồng tham chiếu hợp đồng có chứa các đảm bảo cho hàm tạo (mscorlib.Contracts.dll), vì vậy nó liệt kê các hợp đồng mà trình kiểm tra tĩnh không biết.

Tôi đã thử làm việc với cài đặt Đường dẫn thư viện hợp đồng bổ sung trên toàn dự án không có kết quả và tôi không nghĩ đó là cách phù hợp để giải quyết vấn đề.

Tôi có đúng trong lý do của tôi rằng trình kiểm tra tĩnh không được định cấu hình đúng cách với hợp đồng tham chiếu hợp đồng hoặc tôi thiếu một thứ gì khác không? Nếu tôi đúng, làm thế nào tôi sẽ đi về sửa chữa cấu hình?

Tôi đang sử dụng

  • Visual Studio 2012 cuối cùng Cập nhật 3
  • Mã Hợp đồng Công cụ phiên bản 1.5.60502.11
  • Mã Hợp đồng phiên bản biên tập Extensions VS2012 1.5.64024.12

Chỉnh sửa: Trình kiểm tra tĩnh dường như tìm thấy các hội đồng tham chiếu hợp đồng và nó hoạt động như tôi đã dự kiến ​​trước tiên với các lớp khác và thậm chí cả các phương thức của lớp ReadOnlyCollection<T>. Phân tích tĩnh, ví dụ, phương pháp sau đây hoạt động tốt.

public int Boo() 
    { 
     Contract.Ensures(-1 <= Contract.Result<int>()); 
     Contract.Ensures(Contract.Result<int>() < 4); 

     IList<byte> list = new byte[4]; 
     var collection = new ReadOnlyCollection<byte>(list); 
     Contract.Assume(collection.Count == 4); 
     return collection.IndexOf(0); 
    } 

Giả định về thuộc tính Count là bắt buộc vì đảm bảo của người xây dựng vẫn không hoạt động. Mặt khác, việc đảm bảo phương pháp IndexOf hoạt động rất tốt.

Bây giờ tất cả những gì tôi tự hỏi là tại sao trình kiểm tra tĩnh không nhận ra sự đảm bảo của hàm tạo ReadOnlyCollection<T>. Nó có thể là một lỗi trong phân tích tĩnh?

Trả lời

0

Hợp đồng mã có thể tăng cảnh báo này vì thuộc tính Đếm của lớp ReadOnlyCollection không phải là không đổi.

Trong ví dụ bên dưới, tôi tạo một phiên bản của lớp ReadOnlyCollection, chuyển danh sách chứa 4 số nguyên. Thuộc tính Count trả về giá trị là 4. Sau đó tôi sửa đổi danh sách được gói bởi ReadOnlyCollection bằng cách xóa nó và thêm 3 số nguyên. Thuộc tính Đếm của số ReadOnlyCollection hiện trả về giá trị là 3 mà không cần chạm vào số ReadOnlyCollection.

IList<byte> list = new List<byte>() { 1, 2, 3, 4 }; 
var collection = new ReadOnlyCollection<byte>(list); 

// Outputs: 1, 2, 3, 4. 
foreach (var item in collection) 
{ 
    Console.WriteLine(item); 
} 

list.Clear(); 
list.Add(5); 
list.Add(6); 
list.Add(7); 

// Outputs: 5, 6, 7 
Console.WriteLine(); 
foreach (var item in collection) 
{ 
    Console.WriteLine(item); 
} 

Console.ReadKey(); 
Các vấn đề liên quan