【发布时间】:2016-08-17 18:17:42
【问题描述】:
我遇到了一个扩展方法,它适用于结构 (SomeStruct) 并返回值是否等于 default(SomeStruct)(当调用无参数构造函数时)。
public static bool IsDefault<T> (this T value)
where T : struct
{
return (!EqualityComparer<T>.Default.Equals(value, default(T)));
}
这让我想知道结构是否被装箱。这纯粹是出于好奇,因为拳击/按值传递有优缺点,具体取决于上下文。
假设:
- 以下第一个方法是非法的,因为结构不会隐式覆盖相等运算符
==/!=。 - 第二个“出现”是为了避免拳击。
- 第三种方法应该始终将结构装箱,因为它正在调用
object.Equals(object o)。 - 第四个有两个重载可用
(object/T)所以我假设它也会避免装箱。但是,目标结构需要实现IEquatable<T>接口,这使得辅助扩展方法不是很有帮助。
变化:
public static bool IsDefault<T> (this T value)
where T : struct
{
// Illegal since there is no way to know whether T implements the ==/!= operators.
return (value == default(T));
}
public static bool IsDefault<T> (this T value)
where T : struct
{
return (!EqualityComparer<T>.Default.Equals(value, default(T)));
}
public static bool IsDefault<T> (this T value)
where T : struct
{
return (value.Equals(default(T)));
}
public static bool IsDefault<T> (this T value)
where T : struct, IEquatable<T>
{
return (value.Equals(default(T)));
}
这个问题是关于确认上述假设以及我是否误解和/或遗漏了什么。
【问题讨论】:
标签: c# .net equality value-type boxing