使用“;其中“;将模板限制为非布尔结构类型
本文关键字:布尔 类型 结构 其中 使用 | 更新日期: 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的评论,这是一个过载)。