这个开关盒怎么有无法访问的代码?

How this switch case has unreachable code?

我正在实施一些通用的 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;
    }
}

有人知道吗?

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;
}

(请注意,如果 x 和 y 均为 null,您的摘录 returns false;我尚未在我的版本中修复此问题。)

可以用这个。这将检查 null x 和 y:

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;
        }