كيف يمكنني الإشارة إلى أن الطريقة لا تعيد أبدا NULL باستخدام عقود التعليمات البرمجية؟

StackOverflow https://stackoverflow.com/questions/587452

سؤال

كيف يمكنني الإشارة إلى أن الطريقة لا تعيد أبدا فارغة؟ حاليا هذا هو رمز بلدي.

يحصل الخط 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 هي العقود عبر الأسلوب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top