Может кто-нибудь объяснить, в чем разница между наследованием от ISerializable
интерфейса и объявлением вашего объекта как [Serializable]
?
Я знаю, что в первом случае вы должны реализовать ISerializable
члены интерфейса, в то время как во втором случае эта работа, вероятно, будет выполняться самим C #.
Но тогда для меня не имеет смысла следующее поведение:
public void Foo<T>() where T : ISerializable
{
// Whatever
}
Теперь, если у меня есть какой-нибудь класс, подобный этому:
[Serializable]
public class Value
{
public String Value { get; set; }
}
И, к сожалению, я не могу назвать свой X.Foo<Value>()
, потому что компилятор говорит:
There is no implicit reference conversion from 'Value' to 'System.Runtime.Serialization.ISerializable'
Я почти уверен, что это мое неправильное понимание чего-то очевидного, поэтому, пожалуйста, укажите, что я делаю неправильно.
ОБНОВЛЕНИЕ (ВАЖНО :)
Как заставить оператор where T : ISerializable
работать также с классом [Serializable]
?Есть ли способ?
Я пытаюсь добиться ошибки времени компиляции, если предоставленный тип T
не сериализуем (используя способ [Serializable]
или ISerializable
).
Очевидно, что моя текущая проверка обрабатывает только второй случай, так как мне сделать так, чтобы он обрабатывал оба из них?