我有以下的代码合约:
public void F(string x)
{
Contract.Requires(!string.IsNullOrWhiteSpace(x));
throw new NotImplementedException();
}
编译时,我收到以下警告:
警告 CC1036:在方法 '[...]' 的合同中检测到对方法 'System.String.IsNullOrWhiteSpace(System.String)' 的调用,但没有标记为[Pure]
如何处理?
奇怪的是,我还在其他合同中使用了string.IsNullOrEmpty
,这也没有被标记为[Pure]
,但重写器并没有遇到任何问题。
我的合同重写器版本是1.9.10714.2。
这是我正在使用的String
类实现的相关部分(从元数据中检索):
#region Assembly mscorlib.dll, v4.0.0.0
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\mscorlib.dll
#endregion
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.Runtime.ConstrainedExecution;
using System.Runtime.InteropServices;
using System.Security;
using System.Text;
namespace System
{
// Summary:
// Represents text as a series of Unicode characters.To browse the .NET Framework
// source code for this type, see the Reference Source.
[Serializable]
[ComVisible(true)]
public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparable<string>, IEnumerable<char>, IEquatable<string>
{
// [...]
//
// Summary:
// [...]
public static bool IsNullOrEmpty(string value);
//
// Summary:
// [...]
public static bool IsNullOrWhiteSpace(string value);
为什么缺少 [Pure]
特性?
[Pure]
标记甚至都不应该是必要的。根据文档(第 5.4 节),工具会自动假定以 "System.Diagnostics.Contracts.Contract"、"System.String"、"System.IO.Path" 或 "System.Type" 开头的完全限定名称的任何方法都是纯的。 - Mark Waterman