كيف يمكنني الإشارة إلى أن الطريقة لا تعيد أبدا NULL باستخدام عقود التعليمات البرمجية؟
-
06-09-2019 - |
سؤال
كيف يمكنني الإشارة إلى أن الطريقة لا تعيد أبدا فارغة؟ حاليا هذا هو رمز بلدي.
يحصل الخط 19 على تضمن عدم إثبات رسالة، على الرغم من أن الإبداع يفترض أن النتيجة ليست شيئا.
1 <Pure()> Public Function CreateFunction(Of TArg1, TArg2, TResult)(ByVal body As Func(Of Expression, Expression, BinaryExpression)) As Func(Of TArg1, TArg2, TResult)
2 Contract.RequiresAlways(body IsNot Nothing)
3 Contract.Assume(Contract.Result(Of Func(Of TArg1, TArg2, TResult))() IsNot Nothing)
4
5 Dim arg1 = Expression.Parameter(GetType(Integer), "arg1")
6 Dim arg2 = Expression.Parameter(GetType(Integer), "arg2")
7
8
9 Dim temp = Expression.Lambda(body(arg1, arg2), arg1, arg2)
10 Contract.Assume(temp IsNot Nothing)
11 Return DirectCast(temp.Compile, Global.System.Func(Of TArg1, TArg2, TResult))
12 End Function
13
14 <Pure()> Public Function Add() As Func(Of T, T, T)
15 Contract.Ensures(Contract.Result(Of Func(Of T, T, T))() IsNot Nothing)
16
17 Dim temp = CreateFunction(Of T, T, T)(AddressOf Expression.AddChecked)
18 Return temp
19 End Function
المحلول
هل
Contract.Ensures(Contract.Result() != null);
الشغل؟ في الأساس، سأحاول تقييده حتى تجد أبسط القضية التي لا تعمل كما تتوقع وتذهب من هناك.
- Markusq.
نصائح أخرى
تحتاج إلى تغيير Assume
في CreateFunction
إلى Ensures
. وبعد بعد ذلك يجب أن تكون بخير. تذكر، Assume
هو الافتراضات الداخلية من أجل مساعدة المدقق الثابت محليا. أنها غير مرئية من الأساليب الأخرى. فقط Requires
و Ensures
هي العقود عبر الأسلوب.
لا تنتمي إلى StackOverflow