CA1040: Avoid empty interfaces

Note

This article applies to Visual Studio 2015. If you're looking for the latest Visual Studio documentation, use the version selector at the top left. We recommend upgrading to Visual Studio 2019. Download it here

TypeName AvoidEmptyInterfaces
CheckId CA1040
Category Microsoft.Design
Breaking Change Breaking

Cause

The interface does not declare any members or implement two or more other interfaces.

Rule Description

Interfaces define members that provide a behavior or usage contract. The functionality that is described by the interface can be adopted by any type, regardless of where the type appears in the inheritance hierarchy. A type implements an interface by providing implementations for the members of the interface. An empty interface does not define any members. Therefore, it does not define a contract that can be implemented.

If your design includes empty interfaces that types are expected to implement, you are probably using an interface as a marker or a way to identify a group of types. If this identification will occur at run time, the correct way to accomplish this is to use a custom attribute. Use the presence or absence of the attribute, or the properties of the attribute, to identify the target types. If the identification must occur at compile time, then it is acceptable to use an empty interface.

How to Fix Violations

Remove the interface or add members to it. If the empty interface is being used to label a set of types, replace the interface with a custom attribute.

When to Suppress Warnings

It is safe to suppress a warning from this rule when the interface is used to identify a set of types at compile time.

Example

The following example shows an empty interface.

#include "stdafx.h"
using namespace System;
 
namespace Samples
{
    // Violates this rule
    public interface class IEmptyInterface    
    {    
    };
}
using System;

namespace DesignLibrary
{
   public interface IBadInterface  // Violates rule
   {
   }
}
Imports System     

Namespace Samples         

    Public Interface IBadInterface  ' Violates rule         
    End Interface     

End Namespace