使用“;其中“;将模板限制为非布尔结构类型

本文关键字:布尔 类型 结构 其中 使用 | 更新日期: 2023-09-27 17:59:26

我正在编写一个对除bool之外的所有基本类型都有效的模板。具体来说,它是向不支持Write(bool)的BinaryWriter进行写入。

public void Write<T>(T val) where T : struct
{
    if (binWriter != null)
    {
        binWriter.Write(val);
    }
}

C#编译器给了我错误:

error CS1502: The best overloaded method match for 'System.IO.BinaryWriter.Write(bool)' has some invalid arguments

如果我可以使用where将模板限制为非布尔值,我想我可以摆脱它。有办法这样做吗?或者有其他解决方案可以解决这一限制?

使用“;其中“;将模板限制为非布尔结构类型

您的代码并没有做您认为它会做的事情。编译器正在尝试将binWriter.Write绑定到一个可用的重载。由于object是类型限制中唯一常见的基类,并且没有使用object的重载,因此编译器无法绑定到重载并选择一个重载(我猜是按字母顺序排列的第一个重载)来显示在错误消息中。

可以使用dynamic而不是泛型,并在运行时绑定:

public void Write(dynamic val) 
{
    if (binWriter != null)
    {
        binWriter.Write(val);
    }
}

如果您尝试使用没有适当重载的类型,则在运行时会失败。

另一种选择是确定类型并绑定到适当的过载:

public void Write<T>(T val) where T : struct
{
    if (binWriter != null)
    {
        if(typeof(T) == typeof(bool)
            binWriter.Write((bool)val);
        else if(typeof(T) == typeof(byte)
            binWriter.Write((byte)val);
        ..etc
    }
}

但是,泛型的使用毫无意义。

很遗憾,不是。

您可以提供基类、接口或其他一些约束(请参阅http://msdn.microsoft.com/en-us/library/bb384067.aspx),但不能排除类型,尤其是基元类型。

我建议使用一些转换机制(如果需要的话——根据@Lee的评论,这是一个过载)。