45

Is it possible for a generic interface's type to be based on a specific parent class?

For example:

public interface IGenericFace<T : BaseClass>
{
}

Obviously the above code doesn't work but if it did, what I'm trying to tell the compiler is that T must be a sub-class of BaseClass. Can that be done, are there plans for it, etc.?

I think it would be useful in terms of a specific project, making sure a generic interface/class isn't used with unintended type(s) at compile time. Or also to sort of self-document: show what kind of type is intended.

Chris Marasti-Georg
  • 34,091
  • 15
  • 92
  • 137
Neil C. Obremski
  • 18,696
  • 24
  • 83
  • 112

3 Answers3

94
public interface IGenericFace<T> where T : SomeBaseClass
Ryan Lundy
  • 204,559
  • 37
  • 180
  • 211
67

What your are referring to is called "Generic Constraints". There are numerous constraints that can be put on a generic type.

Some basic examples are as follows:

  • where T: struct - The type argument must be a value type. Any value type except Nullable - can be specified. See Using Nullable Types (C# Programming Guide) for more information.

  • where T : class - The type argument must be a reference type; this applies also to any class, interface, delegate, or array type.

  • where T : new() - The type argument must have a public parameterless constructor. When used together with other constraints, the new() constraint must be specified last.

  • where T : <base class name> - The type argument must be or derive from the specified base class.

  • where T : <interface name> - The type argument must be or implement the specified interface. Multiple interface constraints can be specified. The constraining interface can also be generic.

  • where T : U - The type argument supplied for T must be or derive from the argument supplied for U. This is called a naked type constraint.

These can also be linked together like this:

C#

public class TestClass<T> where T : MyBaseClass, INotifyPropertyChanged, new() { }
public interface IGenericFace<T> where T : SomeBaseClass

VB

Public Class TestClass(Of T As {MyBaseClass, INotifyPropertyChanged, New})
Public Interface IGenericInterface(Of T As SomeBaseClass)
TN.
  • 18,874
  • 30
  • 99
  • 157
Micah
  • 111,873
  • 86
  • 233
  • 325
6

yes.

public interface IGenericFace<T>
    where T : BaseClass
{
}
John Sheehan
  • 77,456
  • 30
  • 160
  • 194