#c# #asp.net #.net
#c# #asp.net #.net
Вопрос:
Есть ли что-нибудь вроде «Ограничения вызова» для C #?
Например, у меня есть следующая функция:
public UInt16 ConvertByteToUInt16 (byte[] buffer)
{
if (buffer.Length != 2)
{
throw new InvalidArgumentException();
}
Convert();
}
Можно ли написать что-то вроде:
public UInt16 ConvertByteToUInt16 (byte[] buffer) : where (buffer.Lenght = 2)
{
Convert();
}
И если я вызову функцию таким образом:
ConvertByteToUInt16 (new byte[] { 0xFF, 0xFF, 0xFF } )
Я хотел бы получить ошибку во время компиляции.
Я совершенно уверен, что ничего подобного не существует на C # 2.0, но, может быть, на C # 4.0?
Заранее спасибо.
Комментарии:
1. Почему бы вам просто не сделать это методом, который принимает ровно 2 байтовых аргумента?
2. Возможно, вам захочется взглянуть на контракты кода: msdn.microsoft.com/en-us/devlabs/dd491992
3. BoltClock: его пример отражает ограничение в два или более, а не только в два.
4. В любом случае вы никогда не сможете получить ошибку времени компиляции при проверке такого типа, поскольку программа должна выполняться, чтобы узнать, какова длина
byte[] buffer
значения. Если вы хотите узнать больше о том, почему это невозможно, прочитайте о проблеме остановки: en.wikipedia.org/wiki/Halting_problem5. у @NathanAnderson все правильно. Хотя это может показаться тривиальным в случае передачи статического массива, как в примере, если вы передаете массив, хранящийся в переменной, возможно, созданный из содержимого файла, компилятор никак не может знать, что эта переменная массива содержит только 2 элемента.
Ответ №1:
Вы не можете сделать это в standard .NET. Вам нужно вручную проверить, а затем создать соответствующее исключение:
public UInt16 ConvertByteToUInt16 (byte[] buffer)
{
if (buffer.Length != 2)
throw new ArgumentException("buffer needs to be of length 2", "buffer");
Convert();
}
Ответ №2:
Насколько я знаю, это невозможно.
Вы можете подумать о DBC (проектирование по контракту), (предварительное условие, последующее условие, инварианты)
Есть хороший пример: http://www.codeproject.com/KB/cs/designbycontract.aspx
Комментарии:
1. (a) Вы заставляете их передавать новый аргумент для чего-то, что на самом деле является константой, что подтверждается (b) вы создаете исключение, указывающее, что значение должно быть 2, когда (c) пользователь действительно может передать 10 и не получить исключение до тех пор, пока байтовый массивдлина также составляла 10.
2. Хороший момент, мой пример бесполезен (уже исправлен), он определенно должен использовать constant .