[Этюд, C# 3.0] Generic constraint
От: nikov США http://www.linkedin.com/in/nikov
Дата: 18.06.08 17:00
Оценка:
Напишите программу, которая бы содержала констрейнт (where T : ...) на типе-параметре одного из методов, и выводила бы на консоль 1. После удаления этого констрейнта результат программы должен стать 0. Оба варианта должны успешно компилироваться. Рефлексия, как обычно, не считается.
Re: [Этюд, C# 3.0] Generic constraint
От: Хэлкар  
Дата: 18.06.08 17:59
Оценка: 27 (4)
using System;

namespace App
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            Test(new A());
            Console.Read();
        }

        private static void Test<T>(T a)// where T:A
        {
            a.Print();
        }
    }

    public static class Ext
    {
        public static void Print(this object a)
        {
            Console.WriteLine(0);
        }

        public static void Print(this A a)
        {
            Console.WriteLine(1);
        }
    }

    public class A
    {
        
    }
}

Собственно констрейт на методе Test (вместо класса A может быть любой другой).
Re: [Этюд, C# 3.0] Generic constraint
От: Ovl Россия  
Дата: 18.06.08 18:33
Оценка:
для второй версии
internal class One { }

internal class Multi : IEquatable<One> {
    public bool Equals(One other)
    {
        Console.WriteLine(1);
        return base.Equals(other);
    }

    public override bool Equals(object obj)
    {
        Console.WriteLine(0);
        return base.Equals(obj);
    }
}

namespace test
{
    public class Program
    {
        static void Main()
        {
            Foo(new Multi());
        }

        static void Foo<T>(T value)
           where T : IEquatable<One>
        {
            value.Equals(new One());
        }
    }
}
Read or Die!
Как правильно задавать вопросы
Как правильно оформить свой вопрос
Автор: anvaka
Дата: 15.05.06
Re[2]: [Этюд, C# 3.0] Generic constraint
От: nikov США http://www.linkedin.com/in/nikov
Дата: 18.06.08 19:43
Оценка:
Здравствуйте, Хэлкар, Вы писали:

Х>
Х>        private static void Test<T>(T a)// where T:A
Х>        {
Х>            a.Print();
Х>        }
Х>


Правильно.
Ну вот так всегда: имеешь в виду что-то хитрое, а коллеги находят простой вариант, о котором я не подумал.
Я хотел чтобы эффект проявился снаружи от generic метода, а оказалось что проще всего это сделать внутри. Можно, конечно, переформулировать условие, хотя это уже будет выглядеть несколько искусственно:

Напишите программу, которая бы содержала констрейнт на типе-параметре одного из методов (этот метод не должен быть виртуальным или абстрактным, и должен быть пустым, то есть не содержать никакого кода), и выводила бы на консоль 1. После удаления этого констрейнта результат программы должен стать 0.
Re[3]: [Этюд, C# 3.0] Generic constraint
От: desco США http://v2matveev.blogspot.com
Дата: 19.06.08 07:52
Оценка: 26 (3)
Здравствуйте, nikov, Вы писали:

<skipped/>

using System;

interface I1 { object Get(); }
interface I2 { A Get(); }

class A { }

class Program
{
    private static void Do<T>(T a)
        where T : A // !
    {}

    public static void Main(string[] args)
    {
        Foo(x => Do(x.Get()), "");
    }

    private static void Foo(Action<I1> a, string x)
    {
        Console.WriteLine(0);
    }
    private static void Foo(Action<I2> b, object x)
    {
        Console.WriteLine(1);
    }
}
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.