1
5
不能使用泛型约束来表示您感兴趣的限制。 泛型并不是用来表示基于不相交类型的变体,而是用来表示在类型层次结构(或实现某些接口的层次结构)上统一的变体。 不过,你还有一些选择。你选择哪一个取决于你想做的事情的确切性质。 使用不同的命名方法来表示每个操作。 我倾向于使用这种方法,当每种方法都在做不同的事情时。您可能会认为,从方法返回不同类型的值本质上是一种不同的操作,应该有自己独特的名称。
提供“默认值”以允许推断类型。 在许多按名称要求值的设计中,提供默认值很有用。这允许您使用重载来区分要调用的方法(基于默认值的类型)。不幸的是,这种方法非常脆弱,并且在将文本值传递给接受数字原语(int vs.uint vs.long)的重载时很容易中断。
就我个人而言,我发现这种情况很难看,而且违反了泛型的精神——泛型应该将功能统一到实现某些接口的层次结构或一组类型上。但是,在某些情况下,这样做是有意义的(假设某个特定类型不受支持)。这种方法的另一个问题是不能从任何参数推断泛型方法的签名,因此在调用泛型方法时必须指定所需的类型。。。在这一点上(从语法的角度来看)并不比使用不同的方法名好多少。
使用out参数而不是返回值。 这种方法工作得很好,但它失去了能够调用方法并对返回值执行操作的简洁语法,因为首先必须声明要填充的变量。
|
2
2
这是不可能做到的编译时支持。您可以在静态构造函数中执行此检查,并在方法体本身中抛出异常(在类型上定义T的情况下)或(在您的情况下),但在这种情况下,这将是一个运行时验证。 |
3
2
不,不可能。 字符串是引用类型,而不是值类型。
根据您在方法中实际执行的操作,可能有各种方法来实现您的目标(switch/case除外)。考虑把你的例子改得更有意义一点。。。 另一种选择可能是将方法私有化,并提供特定的公共包装器:
这将允许您将类的公共成员约束到所需的类型,但仍然在内部使用泛型代码,这样您就不必重复自己。 |
4
1
|
msoft · 串行端口。GetPortNames()返回错误的端口名 9 年前 |
QuangND · 查找准确位置,然后插入或添加,然后排序?哪个更好? 10 年前 |
Kidades · 如何将一个文本文件的内容复制到另一个缩短长度的文本文件? 11 年前 |
Kidades · 如何在Win XP中使应用程序静音? 11 年前 |
Sunkas · 在.net 2.0中从后台调用UI线程上的方法 11 年前 |
linquize · 委托BeginInvoke是否需要清理? 12 年前 |