1

我有更新函数,我想根据输入参数重载(无论是值类型还是引用类型)

public void Update<T>(T item) where T : ValueType

编译器有错误,它坚持我不能使用值类型(并且更多地作为约束)。我应该放弃还是有一种巧妙的方法可以根据我想要的类型重载方法?

4

2 回答 2

3

如果您想要一个值类型(不可为空),请使用结构:

public void Update<T>(T item) where T : struct

于 2012-08-15T15:15:56.630 回答
1

您可以使用它where T : struct来强制它T是一个不可为空的值类型(这不适用于Nullable<T>,尽管它是一个值类型)。

但是,这不会帮助您实现更大的目标,因为您不能通过类型约束重载 - 所以这是无效的:

// Invalid overloading
void Foo<T>(T item) where T : class
void Foo<T>(T item) where T : struct

基本上,尽管类型参数的数量是方法签名的一部分(就重载而言),但名称和约束却不是。

有一些可怕的方法可以解决这个问题,但我建议使用不同的方法名称。

于 2012-08-15T15:18:21.163 回答