Общий метод не может вызвать правильную перегрузку

NB: Я использую среду Mono, если это имеет значение.

Я пишу несколько тестов, и, чтобы помочь с этим, у меня есть следующий общий метод:

static MemoryStream writeValue<T>(T inVal)
{
  MemoryStream ms = new MemoryStream();
  BinaryWriter bw = new BinaryWriter(ms);
  encode_any(bw, inVal);
  return ms;
}

Идея в том, что это вызовет одну из моих перегрузок encode_any , которые делегируют методы, зависящие от типа:

public static void encode_any(BinaryWriter writer, Int32 val) { encode_int32(writer, val); }
public static void encode_any(BinaryWriter writer, Int64 val) { encode_int64(writer, val); }
public static void encode_any(BinaryWriter writer, Float val) { encode_float(writer, val); }
...etc...
public static void encode_any(BinaryWriter writer, bool val) { encode_bool(writer, val); }

Причина, по которой я хочу это сделать, состоит в том, чтобы я мог вызывать правильную реализацию в каждом случае без необходимости в нескольких версии 'writeValue' и без проверки типа времени выполнения каждого элемента перед выбором функции encode_ для вызова.

Однако похоже, что компилятор пытается разрешить перегрузку writeValue, не зная, какой будет тип T, поэтому я получаю эту ошибку:

error CS1502: Лучшее совпадение перегруженного метода для 'BinarySerialiser.encode_any (System.IO.BinaryWriter, bool)' имеет некоторые недопустимые аргументы ошибка CS1503: Аргумент '# 2' не может преобразовать выражение 'T' в тип 'bool'

. Я заметил, что это не относится конкретно к bool - если я изменяю порядок моих функций encode_any, он всегда пытается использовать последнюю. . Может быть, он просто пробует каждый из них, а затем выдает ошибку только тогда, когда у него заканчиваются альтернативы.

Такой код отлично работал бы в C ++, где writeValue компилируется только тогда, когда известно T, но это не Кажется, здесь дело обстоит иначе, и я подозреваю, что это потому, что C # обрабатывает универсальные типы во время выполнения.

Могу ли я изменить свой подход, чтобы эта работа работала, и если да, то как?

6
задан Kylotan 22 August 2011 в 13:05
поделиться