2013-07-03 3 views
0

Мой вопрос является наполовину стилистическим, наполовину функциональным. Я переписываю библиотеку и стараюсь сжать ее как можно больше. (Он принимает путь и считывает значения в ByRef переменной.) Раньше это выглядело так:Эффективная перегрузка дженериками

Public Sub Read(ByVal name As String, ByRef values(,) As Integer)

Public Sub Read(ByVal name As String, ByRef values(,,) As Long)

Etc и т.д. ... Были около из них, в том числе скаляр версии. Кошмар обновить.

Каждый метод был перегружен по типу и рангу. Я переделываю эту систему с помощью дженериков, но у меня проблема. Следующие методы не скомпилируется:

Public Sub Read(Of T)(ByVal name as String, ByRef values As T)

Public Sub Read(Of T)(ByVal name as String, ByRef values As T())

Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,))

Public Sub Read(Of T)(ByVal name as String, ByRef values As T(,,))

Это довольно очевидно, почему он не будет компилироваться; тип 'T' можно легко считать массивом, и компилятор не знает, выбрать ли первую или вторую перегрузку. (Примечание. Эта система работает так, как вы ожидали бы, если не является скалярной версией перегруженных методов чтения.)

Итак, у меня остается головоломка. Я не знаю, как лучше всего создавать эти перегрузки, поэтому я использую наименьший код, сохраняя при этом такую ​​же обратную совместимость с существующим кодом, используя эту библиотеку. (Мы используем его строго в доме, поэтому я мог бы изменить любой код, используя мою библиотеку, но я предпочел бы сохранить подписи как можно больше.)

В принципе, есть способ дизайн моих перегрузок, как я показал? Могу я явным образом сказать компилятору, что я хочу, чтобы верхняя перегрузка использовалась только для скалярных входов? Если нет, то какой лучший дизайн? Я открыт для любых творческих идей.

Благодаря

+0

Странно, что в 'C#' с '.NET 3.5' ​​это не проблема, компилируется и запускается без проблем. В любом случае, постарайтесь сделать так, как в ответе ниже. –

ответ

0

Одна вещи, вы можете попробовать это сделать свою первую перегрузку принимать только структуры (если вы используете только числовые значения в вашем случае).

Public Sub Read(Of T As Structure)(ByVal name as String, ByRef values As T) 

Возможно, это может сделать выбор перегрузки, поскольку массивы не являются структурами.

Еще одна вещь, которую нужно сделать, немного уродливее - сделать все перегрузки массивов с другим именем и скаляром с собственным именем. В скалярной версии вы проверяете, T is Array, подсчитайте размеры и вызовите перегрузку массива propper.

Смежные вопросы