Вывод типа с помощью универсальных методов - PullRequest
0 голосов
/ 21 июня 2011

вот код

class Program
{
    public static bool IsGreaterThan<T>(T x, T y) where T : IComparable<T>
    {
        return (x.CompareTo(y) > 0);
    }

    static void Main(string[] args)
    {
        var result = IsGreaterThan(20,10);
        Console.WriteLine(result); 
    }

}

Просто посмотрите, когда вызываете универсальный метод, такой как IsGreaterThan(20,10);, тогда тип INT не проходит ... так как он работает? Они должны назвать это как IsGreaterThan<int>(20,10)

Если сигнатура метода будет похожа на public static bool IsGreaterThan<INT>(T x, T y) where T : IComparable<T>, то должна ли она работать или нет, если мы вызываем метод без указания типа, как IsGreaterThan (20,10); сюда? .... спасибо

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Вы должны объявить метод следующим образом

public static bool IsGreaterThan<T>(T x, T y) where T : IComparable { return (x.CompareTo(y) > 0);}

в противном случае вы получите ошибку компиляции "Ограничения недопустимы для неуниверсальных объявлений"

Для вызоваметод, вы можете передать тип

    var result = IsGreaterThan<int>(20, 10);
    Console.WriteLine(result);

Однако вы можете игнорировать тип int при вызове, если параметры одного типа.Компилятор позаботится о распознавателе типов, как объяснил Jon

1 голос
/ 21 июня 2011

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

Те же правила для вывода типа применяются к статическим методам, а также к методам экземпляра.Компилятор может вывести параметры типа на основе аргументов метода, которые вы передаете;он не может вывести параметры типа исключительно из ограничения или возвращаемого значения.Поэтому вывод типов не работает с методами, которые не имеют параметров.Вывод типа происходит во время компиляции, прежде чем компилятор попытается разрешить любые перегруженные сигнатуры методов.Компилятор применяет логику логического вывода ко всем универсальным методам с одинаковыми именами.На этапе разрешения перегрузки компилятор включает только те общие методы, для которых вывод типа завершился успешно.

http://msdn.microsoft.com/en-us/library/twcad0zb(v=vs.80).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...