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 может быть любой другой).
Здравствуйте, 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>>
Напишите программу, которая бы содержала констрейнт (where T : ...) на типе-параметре одного из методов, и выводила бы на консоль 1. После удаления этого констрейнта результат программы должен стать 0. Оба варианта должны успешно компилироваться. Рефлексия, как обычно, не считается.
для второй версии
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());
}
}
}
Здравствуйте, Хэлкар, Вы писали:
Х>Х> private static void Test<T>(T a)// where T:A
Х> {
Х> a.Print();
Х> }
Х>
Правильно.
Ну вот так всегда: имеешь в виду что-то хитрое, а коллеги находят простой вариант, о котором я не подумал.
Я хотел чтобы эффект проявился снаружи от generic метода, а оказалось что проще всего это сделать внутри. Можно, конечно, переформулировать условие, хотя это уже будет выглядеть несколько искусственно:
Напишите программу, которая бы содержала констрейнт на типе-параметре одного из методов (этот метод не должен быть виртуальным или абстрактным, и должен быть пустым, то есть не содержать никакого кода), и выводила бы на консоль 1. После удаления этого констрейнта результат программы должен стать 0.