这个开关盒怎么有无法访问的代码?
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;
}
我正在实施一些通用的 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;
}