Как определить универсальный класс, который реализует интерфейс и ограничивает параметр типа? - PullRequest
49 голосов
/ 03 июня 2011
class Sample<T> : IDisposable // case A
{
    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

class SampleB<T> where T : IDisposable // case B
{
}

class SampleC<T> : IDisposable, T : IDisposable // case C
{
    public void Dispose()
    {
        throw new NotImplementedException();
    }
}

Случай C является комбинацией случая A и случая B. Возможно ли это?Как правильно сделать корпус C?

Ответы [ 4 ]

75 голосов
/ 03 июня 2011

Сначала реализованные интерфейсы, затем ограничения общего типа, разделенные where:

class SampleC<T> : IDisposable where T : IDisposable // case C
{        //                      ↑
    public void Dispose()
    {
        throw new NotImplementedException();
    }
}
6 голосов
/ 22 августа 2014

Вы можете сделать это так:

public class CommonModel<T> : BaseModel<T>, IMessage where T : ModelClass
6 голосов
/ 03 июня 2011
class SampleC<T> : IDisposable where T : IDisposable // case C
{    
    public void Dispose()    
    {        
        throw new NotImplementedException();    
    }
}
2 голосов
/ 03 июня 2011
class SampleC<T> : IDisposable where T : IDisposable
{
...
}
...