Краткий ответ: Всегда с использованием обобщенных ограничений - это ненужное использование обобщений перед лицом стандартного полиморфизма, что означает злоупотребление функцией вмоя книга.Я не могу говорить о фактическом эффекте производительности потенциально большого количества общих экземпляров, но я бы не стал рисковать попаданием, если бы не было никакой выгоды.
Длинный ответ:
Для предлагаемогоновый язык, вы можете иметь синтаксис всегда таким, но в идеале компилятор должен пытаться сделать фактические скомпилированные методы как можно более универсальными.Это улучшает возможности разработчика C # / VB / etc, импортирующего ваши библиотеки, так как я не верю, что общие ограничения хорошо проявляются в Intellisense.Это также уменьшает количество общих экземпляров, которые должна выполнить среда выполнения.Однако сделать этот алгоритм может оказаться довольно сложно.Например, я изначально думал, что ваш пример метода может быть переписан так:
TResult FooBar<TParam, TResult>(IFoo<IBar<TParam, TResult>> item, TParam param)
{
return item.Foo().Bar(param);
}
Это близко, но не совсем то же самое из-за отсутствия дисперсии на IFoo
и возможности того, что IBar
может быть реализован структурой, в этом случае дисперсия все равно не поможет.
С другой стороны, пример плохого времени для генерирования универсального метода:
Write = (stream [S], data [D]) [S: Stream, D: byte()] => [] {
stream.Write(data, 0, data.Length)
}
Здесь прямой перевод может дать:
public void Write<S, D>(S stream, D data) where S : Stream, D : byte[]
{ stream.Write(data, 0, data.Length); }
где ни один из общих параметров не требуется из-за стандартного полиморфизма, и вы можете вместо этого вывести это:
public void Write(Stream stream, byte[] data)
{ stream.Write(data, 0, data.Length); }