Этюд "Абстрактные генерики" в C#
От: Nuseraro Россия  
Дата: 30.09.14 06:12
Оценка:
Предлагаю загадку:

Можно ли в C# наложить такие ограничения на генерики (A<T> where T : ...), чтобы они с одной стороны компилировались, а с другой стороны реальный тип, удовлетворяющий этим ограничениям не мог быть создан (в силу неких "противоречий" в ограничениях). Рассматриваются генерики любого типа.
Homo Guglens
Re: Этюд "Абстрактные генерики" в C#
От: Rinbe Россия  
Дата: 30.09.14 07:07
Оценка:
Здравствуйте, Nuseraro, Вы писали:

N> Предлагаю загадку:


N>Можно ли в C# наложить такие ограничения на генерики (A<T> where T : ...), чтобы они с одной стороны компилировались, а с другой стороны реальный тип, удовлетворяющий этим ограничениям не мог быть создан (в силу неких "противоречий" в ограничениях). Рассматриваются генерики любого типа.


Вот так что ли:

 public class A<T> where T : A<T>
    {
        
    }


Re[2]: Этюд "Абстрактные генерики" в C#
От: Nuseraro Россия  
Дата: 30.09.14 07:55
Оценка:
Здравствуйте, Rinbe, Вы писали:

R>
R> public class A<T> where T : A<T>
R>    {
        
R>    }
R>


Хм, а тут в чем проблема?
    public class Z : A<Z>
    {
    }
Homo Guglens
Re[3]: Этюд "Абстрактные генерики" в C#
От: vit_as Россия  
Дата: 30.09.14 08:27
Оценка:
Здравствуйте, 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 или нет удовлетворяет поставленной задачи


public struct A<T>
{

}

public struct Z : A<X>
{
 
}  
Re[4]: Этюд "Абстрактные генерики" в C#
От: Nuseraro Россия  
Дата: 30.09.14 08:35
Оценка:
Здравствуйте, vit_as, Вы писали:

_>Если вопрос ставится таким образом, наследованием, а не непосредственным использованием созданного типа, то тогда любая структура generic или нет удовлетворяет поставленной задачи


Честно говоря, не понял вашу мысль. Мой контрпример про Z:A<Z> может быть скомпилирован и даже как вы пишете "непосредственно использован". Т.е. A<T> where T : A<T> — это не разгадка этюда.
Ваши слова имеют какое-то отношение к исходному этюду?
Homo Guglens
Re[5]: Этюд "Абстрактные генерики" в C#
От: Rinbe Россия  
Дата: 30.09.14 09:19
Оценка:
Здравствуйте, 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>
    {
    }
Re[6]: Этюд "Абстрактные генерики" в C#
От: Nuseraro Россия  
Дата: 30.09.14 09:24
Оценка:
Здравствуйте, 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>
    {

    }

Homo Guglens
Re: Этюд "Абстрактные генерики" в C#
От: scale_tone Норвегия https://scale-tone.github.io/
Дата: 30.09.14 16:14
Оценка: 6 (1) +1
Здравствуйте, Nuseraro, Вы писали:

N>Можно ли в C# наложить такие ограничения на генерики (A<T> where T : ...), чтобы они с одной стороны компилировались, а с другой стороны реальный тип, удовлетворяющий этим ограничениям не мог быть создан (в силу неких "противоречий" в ограничениях). Рассматриваются генерики любого типа.


    class A
    {
        private A()
        {
        }
    }

    class B<T> where T: A, new()
    {
    }


Отредактировано 30.09.2014 16:19 scale_tone . Предыдущая версия .
Re[2]: Этюд "Абстрактные генерики" в C#
От: desco США http://v2matveev.blogspot.com
Дата: 01.10.14 06:59
Оценка: 62 (5)
Здравствуйте, scale_tone, Вы писали:

Класс наследник А вложенный в А будет удовлетворять ограничениям.

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 — остальных кандидатор)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.