Понимание C# generi c и апкастинг - PullRequest
1 голос
/ 28 апреля 2020

Пожалуйста, смотрите следующие примеры:

class A : ISomething
class B : ISomething
class C : ISomething

private void AcceptsISomething<T>(T input) where T : ISomething
{
    if (input is A)
    if (input is B)
    if (input is C)
}

private void AcceptsISomething(ISomething input)
{
    if (input is A)
    if (input is B)
    if (input is C)
}

В чем разница функциональности между двумя примерами выше?

Я думаю, что нет никакой разницы, потому что обе функции гарантируют, что input реализовал ISomething, и в обеих функциях input может быть успешно сопоставлено с типами, которые реализуют ISomething.

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

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Ваш пример очень прост, но в целом есть много вещей, которые вы можете сделать только с where:

Несколько ограничений

void AcceptsISomething<T>(T input) where T : ISomething, new()

Наследование

class Base<T> where T : ISomething

class ChildA : Base<A>

Возвращаемое значение

private T Modify<T>(T input) where T : ISomething

var value = new A();
value = Modify(value); // vs (A)Modify(value)

Тип бетона

private void AcceptsISomething<T>(T input) where T : ISomething
{
    Console.WriteLine(typeof(T));
}

A value = null;
AcceptsISomething(null); // prints "A" although argument is null
2 голосов
/ 28 апреля 2020

Ну, в вашем примере на самом деле нет никакой разницы, но ограничение WHERE для генериков действительно очень полезно. Добавив ограничение WHERE к обобщенной функции c, вы можете убедиться, что используемый тип является производным (или является) типом в ограничении. При этом вы также можете использовать функции этого типа.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters

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