2014-11-21 3 views
0

Мне было интересно, поддерживает ли C# неявное обнаружение типа для генериков классов.Неявное обнаружение типа для генериков

Например, такая функциональность существует в методах методов.

я могу иметь следующий метод:

public void Foo<T>(T obj); 

И называть это так:

int n = 0; 
instance.Foo(n); 

Как вы можете видеть, я не указав <int> родовое ограничение. Это неявно обнаружено, потому что я передал значение int.

Я хочу сделать что-то похож на уровне определения класса:

internal interface IPersistenceStrategy<E, T> : IDisposable 
    where E : UniqueEntity<T> 

Я хочу, чтобы определить как IPersistenceStrategy<MyEntity>, где MyEntity is an UniqueEntity<int>.

Как вы можете видеть, тип типа T, неявно обнаружен с MyEntity.

Однако это не работает. Я должен поставить T параметров в явном виде:

IPersistenceStrategy<MyEntity, int> myStrategy; 

Почему эта функция не работает? Является ли компилятор C# недостаточно умным, чтобы автоматически обнаружить мой тип param?

Есть ли способ выполнить то, что я ищу?

+1

Нет, вы не можете сделать это. – Lee

+0

@ Lee Почему бы и нет? :( –

+0

Просто потому, что это не в спецификации. –

ответ

0

В инициализации не существует выражения типа в объявлениях типового типа. Можно только опустить общий аргумент при вызове шаблонного метода, но это не так с инициализацией общего типа, например:

var list = new List { 2, 3, 4 }; 

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

В вашем конкретном примере, давайте предположим, что компилятор выведено следующее:

IPersistenceStrategy<MyEntity> myStrategy; 

, как IPersistenceStrategy<MyEntity,int> то, что должно произойти, если есть другое заявление, в одной и той же сборки, такие как:

interface IPersistenceStrategy<T> { } 

Ofcourse это будет вызывают неоднозначность. Так что это может быть одной из причин, почему это не допускается.

0

C# имеет тип вывода для методов, но не для конструкторов. Эта функция была предложена в версии C# 6, но, похоже, она была удалена из релиза в соответствии с Mads Torgersen (http://blogs.msdn.com/b/csharpfaq/archive/2014/11/20/new-features-in-c-6.aspx).

также посмотреть на Languages features in C# 6 and VB 14, т.е. нет никакого упоминания об этом

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