Code Contracts with Interfaces: "Method Invocation skipped. Compiler will generate method invocation because the method is conditional... [...]"
Good evening,
I just started playing with Microsoft.Contracts (latest version) and plugging it on top of a sample interface and right now it looks like this:
namespace iRMA2.Core.Interfaces
{
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Diagnostics.Contracts;
/// <summary>
/// Base Interface declarations for iRMA2 Extensions
/// </summary>
[InheritedExport]
[ContractClass(typeof(IiRMA2ExtensionContract))]
public interface IiRMA开发者_开发技巧2Extension
{
/// <summary>
/// Gets the name.
/// </summary>
/// <value>The name of the Extension.</value>
string Name { get; }
/// <summary>
/// Gets the description.
/// </summary>
/// <value>The description.</value>
string Description { get; }
/// <summary>
/// Gets the author of the extension. Please provide complete information to get in touch with author(s) and the corresponding department
/// </summary>
/// <value>The author of the extensions.</value>
string Author { get; }
/// <summary>
/// Gets the major version.
/// </summary>
/// <value>The major version of the extension.</value>
int MajorVersion { get; }
/// <summary>
/// Gets the minor version.
/// </summary>
/// <value>The minor version.</value>
int MinorVersion { get; }
/// <summary>
/// Gets the build number.
/// </summary>
/// <value>The build number.</value>
int BuildNumber { get; }
/// <summary>
/// Gets the revision.
/// </summary>
/// <value>The revision.</value>
int Revision { get; }
/// <summary>
/// Gets the depends on.
/// </summary>
/// <value>The dependencies to other <c>IiRMA2Extension</c> this one has.</value>
IList<IiRMA2Extension> DependsOn { get; }
}
/// <summary>
/// Contract class for <c>IiRMA2Extension</c>
/// </summary>
[ContractClassFor(typeof(IiRMA2Extension))]
internal sealed class IiRMA2ExtensionContract : IiRMA2Extension
{
#region Implementation of IiRMA2Extension
/// <summary>
/// Gets or sets the name.
/// </summary>
/// <value>The name of the Extension.</value>
public string Name
{
get
{
Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()));
return default(string);
}
set
{
Contract.Requires(value != null);
}
}
/// <summary>
/// Gets the description.
/// </summary>
/// <value>The description.</value>
public string Description
{
get { throw new NotImplementedException(); }
}
/// <summary>
/// Gets the author of the extension. Please provide complete information to get in touch with author(s) and the corresponding department
/// </summary>
/// <value>The author of the extensions.</value>
public string Author
{
get { throw new NotImplementedException(); }
}
/// <summary>
/// Gets the major version.
/// </summary>
/// <value>The major version of the extension.</value>
public int MajorVersion
{
get { throw new NotImplementedException(); }
}
/// <summary>
/// Gets the minor version.
/// </summary>
/// <value>The minor version.</value>
public int MinorVersion
{
get { throw new NotImplementedException(); }
}
/// <summary>
/// Gets the build number.
/// </summary>
/// <value>The build number.</value>
public int BuildNumber
{
get { throw new NotImplementedException(); }
}
/// <summary>
/// Gets the revision.
/// </summary>
/// <value>The revision.</value>
public int Revision
{
get { throw new NotImplementedException(); }
}
/// <summary>
/// Gets the Extensions this one depends on.
/// </summary>
/// <value>The dependencies to other <c>IiRMA2Extension</c> this one has.</value>
public IList<IiRMA2Extension> DependsOn
{
get
{
Contract.Ensures(Contract.Result<IList<IiRMA2Extension>>() != null);
return default(IList<IiRMA2Extension>);
}
}
#endregion
}
}
Now why are the two Contract.Ensures(...) 'blured' out visually with the tooltip saying "Method Invocation skipped. Compiler will generate method invocation because the method is conditional or it is partial method without implementation" and in fact the CodeContracts output does not count/show them... What am I missing & doing wrong here?
-J
Do you have the appropriate code contracts macros defined for this build? For example CONTRACTS_FULL
? Not having the right macros defined could cause the methods to be excluded from compilation.
精彩评论