当你使用T:struct约束泛型类型时,你获得了任何操作吗?

时间:2010-03-24 23:02:13

标签: c# .net vb.net generics

这可能是一个抽象的问题,所以请提前道歉。

我正在研究.NET中的泛型,并且想知道where T : struct约束。

据我所知,这允许您限制用作值类型的类型。我的问题是,没有任何类型约束,你可以在T上进行有限数量的操作。

您是否能够在指定where T : struct时使用任何其他操作,或者是限制您可以传入的类型的唯一值?

修改

到目前为止,有些有趣的答案,谢谢。 我想我实际问的问题是,如果我要写,(在讨论如何使用泛型),

  

“现在你已经限制了   您可以键入值类型的参数   也可以使用该类型的对象进行___________________“

有什么东西可以放在那空白处吗?我可以为其他约束考虑事情,但不能考虑这个。

4 个答案:

答案 0 :(得分:4)

所有T : struct获得的是隐式new()构造函数,以及一些涉及null的明显事物。也许更重要的是,调用者不能使用类,接口或Nullable<T>

您之后进行了哪些类型的操作?对于运算符,请尝试4.0中的dynamic或3.5中的MiscUtil

答案 1 :(得分:2)

您获得的与其他可能的约束集相关的唯一事情是能够处理Nullable<T>类型的值(这就是为什么T: struct禁止调用者将Nullable<T>作为传递的原因type参数 - 它不能嵌套)。

答案 2 :(得分:0)

不,通过指定T泛型类型约束,您无法在where T: struct上获得任何操作。您将调用者限制为仅指定值类型(Nullable<T>值类型除外,这是不允许的。)

答案 3 :(得分:0)

一种类型的操作保证不可用于可变类并且有时可用于可变结构是能够使用赋值运算符复制事物的状态。使用带结构的变异接口很棘手,因为在只读上下文中尝试在结构上使用变异接口将产生干净编译但不起作用的代码(我真的希望编译器能够识别结构和接口成员的属性,表明它们不应该在只读结构上使用)。尽管如此,在某些情况下,这样的事情可能会有用。

例如,如果算法需要能够存储枚举数的状态并将枚举数恢复为其保存状态,并且枚举数是TEnum约束于structIEnumerator<T>, it may be possible to copy the的泛型类型。 to a local variable of that type and then later copy it back. Note that this would work with some but not all TEnum types which implement struct ; such a technique should in practice probably only be used with interfaces that explicitly document a requirement that all legitimate struct-type implementations must exhibit value semantics ( IEnumerable void ActOnSequence<T>(T theEnumerator) where T:struct, IEnumerator<String>; void ActOnSequence(IEnumerator<String> theEnumerator); IEnumerator`没有这样的文档要求。)

请注意,代码可能会使用在存在时按值复制结构的能力,这确实排除了使用接口的类类型实现稍微不同(可能效率较低)的方法的可能性。功能签名:

struct

可以共存并毫无困难地使用。前者将在接口的值类型实现上调用,而后者将在堆类型实现上调用。请注意,如果没有{{1}}约束,就不可能在范围内同时使用上述两种方法并自动调用正确的方法。