Mam bardzo prostą klasę wykorzystania umów kodu .NET:Dlaczego analiza statyczna ignoruje podwójne <= and > = wymaganie?
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;
}
}
Kiedy wywołać metodę z wartością ujemną, spodziewam statycznej analizy kodu, by ostrzegać mnie o tym.
class Program
{
static void Main(string[] args)
{
var barMansSquareroot = new ContractSquareRoot();
// This should not be possible...
barMansSquareroot.CalculateSquareRoot(-42);
}
}
Ale nawet jeśli Contract.Requires
nie rzuca żądany wyjątek, statyczna analiza kodu oznacza każde twierdzenie prawidłowe. Co ciekawe, ostrzega mnie przed naruszeniem, gdy zmienię typ wartości na int
lub jeśli zmienię <=
na <
. Zachowanie jest ograniczone do double
i float
. Zakładam, że ma to coś wspólnego z precyzją wartości zmiennoprzecinkowych.
Działa nawet kiedy formułuje wymóg takiego:
Contract.Requires<ArgumentException>(!(0 > value));
Czy to bug czy ja robię coś źle?
Po prostu nie interesuje Cię, dlaczego nie pozwolisz 0 jako prawidłowej wartości? – thumbmunkeys
Chcę, aby wartość 0 była dozwolona. umowa powinna zapewnić, że każda wartość wynosi> = 0. – vlow
Zdecydowanie interesujące, spróbuję skontaktować się z Francesco, https://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-1ce455f66970 –