Рассмотрим:
class MyClass<T> where T : class
{
}
В этом случае предложение where использует спецификацию, что MyClass является только общим ссылочным типом.
В идеале я должен иметь unit test, который проверяет эту спецификацию. Однако этот unit test, очевидно, не будет работать, но он объясняет, что я пытаюсь выполнить:
[Test]
[DoesNotCompile()]
public void T_must_be_a_reference_type()
{
var test = new MyClass<int>();
}
Что я могу сделать, чтобы проверить спецификацию, которая реализована, не позволяя компилировать код?
ИЗМЕНИТЬ
Дополнительная информация: Хорошо, поэтому мои аргументы в пользу этого (ха-ха) заключаются в том, что я слежу за методологией TDD, в которой вы не можете писать код, если у вас нет неудачного unit test. Скажем, у вас было это:
class MyClass<T> { }
Какой тест вы можете написать, если бы T не был классом? Что-то вроде default(T) == null
?
Далее EDIT:
Итак, после "анализа основных причин" проблема заключается в том, что я полагался на default(T)
null
у потребителя этого класса неявным образом. Я смог реорганизовать этот потребительский код в другой класс и указать там ограничение общего типа (ограничение на class
), что фактически делает этот код не компилируемым, если кто-то должен удалить ограничение на класс, о котором я говорю выше.