Принимая во внимание следующую сигнатуру метода, почему при явном названии параметра компилятор не может автоматически определить тип?Visual Studio 2010 с пакетом обновления 1 (SP1) может выводить тип и не отображает предупреждений или ошибок.
IEnumerable<T> ExecuteCommand<T>(
string commandText,
string connectionName = null,
Func<IDataRecord, T> converter = null) { ... }
static SomeClass Create(IDataRecord record) { return new SomeClass(); }
void CannotInferType() {
var a = ExecuteCommand(
"SELECT blah",
"connection",
converter: Test.Create);
}
void CanInferType() {
var a = ExecuteCommand(
"SELECT blah",
"connection",
Test.Create);
}
Вызывая его, как описано в CannotInferType
, и при попытке его компиляции компилятор выдает error CS0411: The type arguments for method 'Test.ExecuteCommand<T>(string, string, System.Func<System.Data.IDataRecord,T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
, тогда как вызывая его какописанный в CanInferType
работает должным образом.
Как указано выше, сама Visual Studio не сообщает о проблемах, и для переменной a
intellisense показывает IEnumerable<SomeClass>
, как и ожидалось, но по какой-то причине она не компилируется.