我有一个小的实用程序类:
public static class SerializationUtilities
{
public static string ToXml<T>(T @object)
{
Contract.Requires<ArgumentNullException>(@object != null);
Contract.Requires<ArgumentException>(typeof(T).IsSerializable);
Contract.Ensures(!string.IsNullOrEmpty(Contract.Result<string>()));
var xs = new XmlSerializer(typeof(T));
var result = new StringBuilder();
using (var sw = new StringWriter(result))
{
xs.Serialize(sw, @object);
}
return result.ToString();
}
public static T FromXml<T>(string xml)
{
Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(xml));
Contract.Ensures(!object.Equals(Contract.Result<T>(), default(T)));
var xs = new XmlSerializer(typeof(T));
using (var sr = new StringReader(xml))
{
return (T)xs.Deserialize(sr);
}
}
}
这两种方法都按预期工作。
但是,代码合约静态检查器会抛出两个警告:
警告 30 CodeContracts:确保未经证实:!string.IsNullOrEmpty(Contract.Result())
警告 28 CodeContracts:确保未经证实:!object.Equals(Contract.Result(), default(T))
为什么会发出这些警告?将我的方法合同化的正确(最佳?)方法是什么?