Я не уверен, что я использую здесь правильные условия. Но я просто думаю, если есть какая-то существенная разница между assignment compatibility
и type constraints
. Позвольте мне объяснить это с кодом:Разница между совместимостью назначений и ограничениями типов в C#?
public class A {}
public class B : A {}
public class C : A {}
public static void Test(A a){}
public static void Test2<T>(T a) where T : A {}
Из кода выше, есть ли разница между Test
и Test2
? Я могу назвать оба Test
и Test2
с A
или любым из его производных типов (B and C
). Но как они отличаются от компилятора? Метод generic
каким-то образом сохраняет такой тип, что если я его назову B
, он не будет отбрасывать его до A
, я пробовал экспериментировать с разрешением перегрузки, но, похоже, нет никакой разницы, см. Мой эксперимент с разрешениями перегрузки.
class Program
{
public class A {}
public class B : A {}
public class C : A {}
public static void Test(A a) { O(a); }
public static void Test2<T>(T a) where T : A { O(a); }
public static void O(A a) { Console.WriteLine("A"); }
public static void O(B a) { Console.WriteLine("B"); }
public static void O(C a) { Console.WriteLine("C"); }
static void Main(string[] args)
{
Test2<A>(new A());
Test2<B>(new B());
Test2<C>(new C());
Test(new A());
Test(new B());
Test(new C());
Console.Read();
}
}
Все просто распечатывается A
. Может ли кто-то пролить свет на это, почему вы используете один над другим?
С функциональной точки зрения, я могу» Подумайте о том, как ваши два примера будут отличаться. Тем не менее, имейте в виду, что вы можете применить ноль, одно или несколько ограничений к одному и тому же параметру общего типа, и есть несколько, которые не относятся к определенному базовому классу или интерфейсу. – jmcilhinney
В дополнение к ответам ниже, еще один незначительный оттенок разницы, потенциально заслуживающий внимания, сравнивающий эти два. Если 'A' - это интерфейс, а' B' или 'C' - это структура, то вызов общего метода с общим параметром, введенным в« B »или« C »(не' A'), будет избегать операции бокса. Вызов метода «Test (A a)» с помощью структуры «B» или «C» приведет к операции по боксу. –