IEquatable c#

Рейтинг: 2Ответов: 1Опубликовано: 22.01.2015

Господа, подскажите, почему код не компилится. Вроде, все правильно подставляю, а он ругается.

   interface IE<T>
{
    void Z();
}
class a <T> : IE<T>
{
    public void Z()
    {
        Console.WriteLine(1);
    }
}
class b
{
    public static void F<T>() where T : IE<T>
    {
        Console.WriteLine("Hello");
    }
}
class c
{
    static void Main()
    {
        b.F<a<int>>();
    }
}

Обновление

Ошибка 1 Не удается использовать тип "a<int>" в качестве параметра типа "V" для базового типа или метода "b.F<V>()". Отсутствует неявное преобразование ссылки из "a<int>" в "System.IEquatable<a<int>>". C:\Users\Sergey\documents\visual studio 2012\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs 25 9 ConsoleApplication2

Я не могу понять почему, ведь я же правильный аргумент типа подставляю.

Ответы

▲ 3Принят

Смотрите.

Ваше условие where V : IEquatable<V>. В вашем вызове F<a<int>>(), то есть V = a<int>, значит, необходимо a<int> : IEquatable<a<int>>. Но у вас есть лишь a<int> : IEquatable<int>.


Возможно, вы хотите на самом деле

public static void F<U, V>() where U : IEquatable<V>

и

b.F<a<int>, int>();

Стоп, наверное, правильно всё же вот как:

class a<T> : IEquatable<а<T>>
{
    ...

Вы ведь хотите, чтобы экземпляры a<int> можно было сравнивать с другими экземплярами a<int>, а не с int?