Tôi có một lớp học rất đơn giản sử dụng .NET Mã Hợp đồng:Tại sao phân tích tĩnh bỏ qua đôi <= and > = yêu cầu?
public class ContractSquareRoot
{
/// <summary>
/// Makes your life much easier by calling Math.Sqrt for you. Ain't that peachy.
/// </summary>
/// <param name="value">The value to calculate the square root from. No negatives!</param>
/// <returns>The square root of the given value. Obviously always > 0.</returns>
public double CalculateSquareRoot(double value)
{
Contract.Requires<ArgumentException>(0 <= value);
Contract.Ensures(0 <= Contract.Result<double>());
double squareRoot = Math.Sqrt(value);
return squareRoot;
}
}
Khi tôi gọi phương thức với một giá trị tiêu cực, tôi hy vọng các phân tích mã tĩnh để cảnh báo tôi về điều đó.
class Program
{
static void Main(string[] args)
{
var barMansSquareroot = new ContractSquareRoot();
// This should not be possible...
barMansSquareroot.CalculateSquareRoot(-42);
}
}
Nhưng ngay cả khi Contract.Requires
không ném ngoại lệ mong muốn, phân tích mã tĩnh đánh dấu mọi xác nhận là chính xác. Điều thú vị là, nó cảnh báo tôi về vi phạm khi tôi thay đổi loại giá trị thành int
hoặc nếu tôi thay thế <=
bằng <
. Hành vi sai trái được giới hạn ở double
và float
. Tôi giả sử nó có một cái gì đó để làm với độ chính xác của các giá trị dấu chấm động.
Nó thậm chí hoạt động khi tôi xây dựng các yêu cầu như thế này:
Contract.Requires<ArgumentException>(!(0 > value));
Có phải đó là một lỗi hay tôi làm điều gì sai?
không quan tâm, tại sao bạn không cho phép 0 làm giá trị hợp lệ? – thumbmunkeys
tôi muốn cho phép 0 làm giá trị hợp lệ. hợp đồng phải đảm bảo rằng mọi giá trị là> = 0. – vlow
Chắc chắn thú vị, tôi sẽ cố gắng liên hệ với Francesco, https://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-1ce455f66970 –