Примечание: я использую среду 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_ вызывать.
Однако, похоже, что компилятор пытается разрешить перегрузкуof writeValue, не зная, какой будет тип T, поэтому я получаю эту ошибку:
ошибка CS1502: наилучшее перегруженное соответствие метода для 'BinarySerialiser.encode_any (System.IO.BinaryWriter, bool)' имеет некоторыеошибка недопустимых аргументов CS1503: Аргумент '# 2' не может преобразовать выражение 'T' в тип 'bool'
Я заметил, что это не относится конкретно к bool- если я переставлю порядок моих функций encode_any, он всегда попытается использовать последнюю.Может быть, он просто пробует каждый из них, а затем выдает ошибку только тогда, когда у него заканчиваются альтернативы.
Этот вид кода будет хорошо работать в C ++, где writeValue
компилируется только тогда, когда T известен, но это не 'Похоже, что здесь дело обстоит именно так, и я подозреваю, что это потому, что C # обрабатывает универсальные типы во время выполнения.
Могу ли я изменить свой подход, чтобы заставить это работать, и если да, то как?