2016-07-09 2 views
0
static List<T> GetInitializedList<T>(T value, int count) 
{ 
    List<T> list = new List<T>(); 

    for (int i = 0; i < count; i++) 
    { 
     list.Add(value); 
    } 
    return list; 
} 

Выше показан общие методы могут быть вызвана следующим образом ...методы C# Общих и Вызов способ

EX-1

List<bool> list1 = GetInitializedList(true, 5); 

EX-2

List<string> list2 = GetInitializedList<string>("Perls", 3); 

Я хочу знать о различии между вызовами этих общих методов с использованием EX-1 и EX-2

Что является самым эффективным/стандартным/лучшим способом вызова метода genric.

EX-1 или ЕХ-2

ответ

2

Нет разницы, второй способ имеет избыточную указанного типа. Компилятор уже пытается передать тип из параметров.

Когда вы пишете:

List<string> list2 = GetInitializedList("Perls", 3); 

Компилятор делает вывод, что T является строкой, так как тип параметра value строка.

В последних версиях Visual Studio IDE рекомендует удалить <string>, если компилятор смог вывести тип.

Если компилятор не может вывести тип, вам не нужно использовать второй подход. Пример:

public void GenericMethod<T>() 
{ 

} 

Здесь вы сила, чтобы указать тип, так как нет никаких параметров, из которых компилятор может определить тип.

Это не будет компилироваться:

GenericMethod(); 

будет скомпилирован:

GenericMethod<string>(); 

Есть и другие случаи, когда компилятор не может определить тип. Поэтому вы должны явно указать его.

7

Они эквивалентны. В принципе, если вы не укажете аргументы типа методу (т. Е. Типы в <> в вызове метода), компилятор попытается использовать вывод типа , чтобы определить, какие аргументы типа, которые вы имели в виду, на основе аргументы (выражения в () в вызове метода).

Они составляют точно тот же код, когда компилятор запрашивает аргументы типа, которые вы хотели. В некоторых случаях вам нужно указать аргументы типа, если:

  • Тип не может быть выведен компилятором.Пример:

    GetInitializedList<string>(null, 5); 
    

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

  • Тип, который должен был сделать компилятор, не то, что вы хотите. Пример:

    List<object> objects = GetInitializedList<object>("foo", 5); 
    

    Здесь компилятор вывести аргумент типа из string, который не то, что мы хотим.

+3

Получается, даже если я прочитаю C# по глубине и даю ответ перед Джоном Скитом. Он по-прежнему получает все вверх-голоса :) – user3185569

+0

@ user3185569 даже Чак Норрис не может дать лучший выигрышный ответ, чем Джон Скит. –

1

Нет разницы, то, что вы действительно имеете в обоих случаях, является последней версией.

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

 Смежные вопросы

  • Нет связанных вопросов^_^