Может ли .NET неявно обнаружить один параметр типа из другого? - PullRequest
1 голос
/ 29 августа 2011

У нас есть базовый класс для большинства наших доменных объектов:

public class AbstractEntity<TKey>
{
    public virtual TKey ID { get; set; }
}

Теперь, например, у меня есть класс MobileOperator : AbstractEntity<int>.

Что я хочусделать, чтобы написать общий компаратор равенства для всех потомков AbstractEntity.И я хочу создать его так:

var comparer = new AbstractEntityComparer<MobileOperator>();

Я объявляю этот компаратор следующим образом:

public class AbstractEntityEqualityComparer<TAbstractEntity, TId> : IEqualityComparer<TAbstractEntity>
    where TAbstractEntity : AbstractEntity<TId>

Однако в этом случае я должен явно указать компилятору, что TId = int:new AbstractEntityComparer<MobileOperator, int>().И если я скажу, скажем, long вместо int, он просто не скомпилируется.Итак, определенно, у компилятора есть способ определить, какой тип я использую для создания MobileOperator.

Так что возможно написать компаратор так, чтобы я не писал эту избыточную int вещь всевремя?И если да, как я могу это сделать?

1 Ответ

1 голос
/ 29 августа 2011

C # не делает вывод типов на основе ограничений, поэтому вам нужна явная универсальная конструкция. Подробности см. В этом блоге Эрика Липперта (а также в комментариях о том, почему он не прав, а не прав).

...