Можно ли использовать несвязанный тип в качестве параметра универсального типа в C #? - PullRequest
8 голосов
/ 09 сентября 2011

У меня есть общий C #:

public class Generic<TParameter> { ... }

Не похоже, что я могу использовать несвязанные типы в качестве параметров типа.Я получаю error CS1031: Type expected при попытке выполнить следующее:

var lGenericInstance = new Generic<List<>>();

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


Обновление: На мой вопрос о несвязанном типе дан ответ, поэтому япоследовал отдельный вопрос , касающийся моей конкретной проблемы.

Ответы [ 2 ]

7 голосов
/ 09 сентября 2011

Попробуйте это:

class Foo<T> { }
class Bar<T> { }

Type unboundBar = typeof(Bar<>);
Type unboundFoo = typeof(Foo<>);
Type boundFoo = unboundFoo.MakeGenericType(new[] { unboundBar });
Console.WriteLine(boundFoo.Name);
Conosle.WriteLine(boundFoo.GetGenericArguments().First().Name);

Обратите внимание, что вы не можете написать

Type boundFoo = typeof(Foo<Bar<>>)

потому что в спецификации явно указано:

Несвязанный универсальный тип может использоваться только внутри typeof-выражения (§7.6.11).

(Bar<> не используется в качестве параметра для typeof-выражения здесь, скорее, это параметр общего типа для параметра для typeof-выражения .)

Однако в рамках CLR это совершенно законно, как показано выше с использованием отражения.

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

2 голосов
/ 09 сентября 2011

вопрос, который вы задаете, по моему мнению, сформулирован неправильно.

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

вот это: var lGenericInstance = new Generic<List<>>(); терпит неудачу на List, а не на Generic ... хорошо на обоих, потому что они связаны ...:)

так что ваш вопрос больше похож на:

почему я не могу создать объект типа List<>? или почему я не могу указать List<> как T для моего общего класса?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...