Можно ли в C# наложить такие ограничения на генерики (A<T> where T : ...), чтобы они с одной стороны компилировались, а с другой стороны реальный тип, удовлетворяющий этим ограничениям не мог быть создан (в силу неких "противоречий" в ограничениях). Рассматриваются генерики любого типа.
Здравствуйте, Nuseraro, Вы писали:
N> Предлагаю загадку:
N>Можно ли в C# наложить такие ограничения на генерики (A<T> where T : ...), чтобы они с одной стороны компилировались, а с другой стороны реальный тип, удовлетворяющий этим ограничениям не мог быть создан (в силу неких "противоречий" в ограничениях). Рассматриваются генерики любого типа.
Здравствуйте, Nuseraro, Вы писали:
N>Здравствуйте, Rinbe, Вы писали:
R>>
R>> public class A<T> where T : A<T>
R>> {
R>> }
R>>
N>Хм, а тут в чем проблема? N>
N> public class Z : A<Z>
N> {
N> }
N>
Если вопрос ставится таким образом, наследованием, а не непосредственным использованием созданного типа, то тогда любая структура generic или нет удовлетворяет поставленной задачи
Здравствуйте, vit_as, Вы писали:
_>Если вопрос ставится таким образом, наследованием, а не непосредственным использованием созданного типа, то тогда любая структура generic или нет удовлетворяет поставленной задачи
Честно говоря, не понял вашу мысль. Мой контрпример про Z:A<Z> может быть скомпилирован и даже как вы пишете "непосредственно использован". Т.е. A<T> where T : A<T> — это не разгадка этюда.
Ваши слова имеют какое-то отношение к исходному этюду?
Здравствуйте, Nuseraro, Вы писали:
N>Здравствуйте, vit_as, Вы писали:
_>>Если вопрос ставится таким образом, наследованием, а не непосредственным использованием созданного типа, то тогда любая структура generic или нет удовлетворяет поставленной задачи
N>Честно говоря, не понял вашу мысль. Мой контрпример про Z:A<Z> может быть скомпилирован и даже как вы пишете "непосредственно использован". Т.е. A<T> where T : A<T> — это не разгадка этюда. N>Ваши слова имеют какое-то отношение к исходному этюду?
Еще вариант:
public interface IA<T, U> where T : struct, IA<T, U> where U : class, IA<T, U>
{
}
Здравствуйте, Rinbe, Вы писали:
R>Здравствуйте, Nuseraro, Вы писали:
N>>Здравствуйте, vit_as, Вы писали:
_>>>Если вопрос ставится таким образом, наследованием, а не непосредственным использованием созданного типа, то тогда любая структура generic или нет удовлетворяет поставленной задачи
N>>Честно говоря, не понял вашу мысль. Мой контрпример про Z:A<Z> может быть скомпилирован и даже как вы пишете "непосредственно использован". Т.е. A<T> where T : A<T> — это не разгадка этюда. N>>Ваши слова имеют какое-то отношение к исходному этюду?
R>Еще вариант:
R>
R> public interface IA<T, U> where T : struct, IA<T, U> where U : class, IA<T, U>
R> {
R> }
R>
public class C : IA<S, C>
{
}
public struct S : IA<S,C>
{
}
Здравствуйте, Nuseraro, Вы писали:
N>Можно ли в C# наложить такие ограничения на генерики (A<T> where T : ...), чтобы они с одной стороны компилировались, а с другой стороны реальный тип, удовлетворяющий этим ограничениям не мог быть создан (в силу неких "противоречий" в ограничениях). Рассматриваются генерики любого типа.
class A
{
private A()
{
}
}
class B<T> where T: A, new()
{
}
Класс наследник А вложенный в А будет удовлетворять ограничениям.
class A
{
private A() {}
class C: A {}
B<C> field;
}
class B<T> where T: A, new() {}
как вариант:
class C<T1, T2>
where T1: class, IDisposable, new()
where T2: struct, T1
{
}
Комбинация T1: class, T2: struct, T1 разрешает в качестве T1 использовать только System.Object, System.Enum, System.ValueType или интерфейс. constructor constraint убирает интерфейсы, а IDisposable (ну или любой другой интерфейс, который не реализуют Object\Enum\ValueType — остальных кандидатор)