Ограничение вызова функции

#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_problem

5. у @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 .