Они не совпадают, потому что второй не компилируется :
ошибка CS0702: ограничение не может быть специальным классом ValueType
Однако да: T : struct
означает «T - это тип значения». Тонкое различие состоит в том, что теоретически Method<ValueType>()
сам удовлетворяет T : ValueType
, а ValueType
- это class
, а не struct
.
Кроме того, T : struct
не позволяет использовать обнуляемый T?
, то есть Method<int?>
недопустимо, даже если int?
(он же Nullable<int>
) является типом значения.