Код: Выделить всё
public static bool IsDefault (this T value)
where T : struct
{
return (EqualityComparer.Default.Equals(value, default(T)));
}
Предположения:
- Первый из следующих методов недопустим, поскольку структуры не переопределяют неявно операторы равенства ==/!=.
- Второй «появляется», чтобы избежать упаковки .
- Третий метод всегда должен упаковывать структуру, поскольку он вызывает object.Equals(object o).
- Четвертый имеет оба доступны перегрузки (object/T), поэтому я предполагаю, что он также будет избегать бокса. Однако целевая структура должна будет реализовать интерфейс IEquatable, что делает вспомогательный метод расширения не очень полезным.
Код: Выделить всё
public static bool IsDefault (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 (this T value)
where T : struct
{
return (EqualityComparer.Default.Equals(value, default(T)));
}
public static bool IsDefault (this T value)
where T : struct
{
return (value.Equals(default(T)));
}
public static bool IsDefault (this T value)
where T : struct, IEquatable
{
return (value.Equals(default(T)));
}
Подробнее здесь: https://stackoverflow.com/questions/368 ... out-boxing