函数调用约束

本文关键字:约束 函数调用 | 更新日期: 2023-09-27 18:12:48

是否有类似于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上?

函数调用约束

在标准的。net中不能这样做。您需要手动检查,然后抛出一个适当的异常:

public UInt16 ConvertByteToUInt16 (byte[] buffer)
{
    if (buffer.Length != 2)
        throw new ArgumentException("buffer needs to be of length 2", "buffer");
    Convert();       
}    

据我所知这是不可能的。

你可以考虑DBC(契约式设计),(前置条件,后置条件,不变量)

有一个很好的例子:http://www.codeproject.com/KB/cs/designbycontract.aspx