Как этот случай переключения имеет недоступный код? - PullRequest
0 голосов
/ 26 августа 2018

Я реализовывал какой-то общий метод IEqualityComparer<T> Equal(), когда код в коммутаторе недоступен без видимой для меня причины:

public bool Equals(T x, T y)
{
    switch (nameof(T))
    {
        case nameof(Accessory):
            return (x as Accessory).Id == (y as Accessory).Id;//not reachable
        default:
            return false;
    }
}

У кого-то есть подсказка?

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Можно использовать это. Это проверяет на нулевые х и у:

public bool Equals(T x, T y)
        {
            if (ReferenceEquals(x, y)) return true;
            if (ReferenceEquals(x, null)) return false;
            if (ReferenceEquals(y, null)) return false;


    if (x.GetType()

 != y.GetType()) return false;
            return x.Id == y.Id;
        } 
0 голосов
/ 26 августа 2018

nameof вычисляет имя T в время компиляции , поэтому это постоянная строка, "T", и, таким образом, будет взят только случай default.

Вот альтернативная реализация:

public bool Equals(T x, T y)
{
    if (x is Accessory && y is Accessory)
    {
        var ax = x as Accessory;
        var ay = y as Accessory;
        return ax.Id == ay.Id;
    }
    return false;
}

C # 7.1 вводит некоторый синтаксический сахар:

public bool Equals(T x, T y)
{
    if (x is Accessory ax && y is Accessory ay)
    {
        return ax.Id == ay.Id;
    }
    return false;
}

(Обратите внимание, что ваш отрывок возвращает false, если x и y равны null; Я не исправил это в моих версиях.)

...