C# 2.0 --Constraints

博客主要讨论了C#中泛型类的类型约束问题。泛型类常需对类型参数对应的对象调用方法,但因类型参数可能为任意类型,直接调用特定方法会编译报错。虽可通过类型转换解决,但会增加运行时开销,还可能在运行时抛出异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

19.1.1 Constraints

Commonly, a generic class will do more than just store data based on a type parameter. Often, the generic class will want to invoke methods on objects whose type is given by a type parameter. For example, an Add method in a Dictionary<K,V> class might need to compare keys using a CompareTo method:

public class Dictionary<K,V>
{
public void Add(K key, V value)
{
     ...

     if (key.CompareTo(x) < 0) {...}    // Error, no CompareTo method
     ...
}
}

Since the type argument specified for K could be any type, the only members that can be assumed to exist on the key parameter are those declared by type object, such as Equals, GetHashCode, and ToString; a compile-time error therefore occurs in the example above. It is of course possible to cast the key parameter to a type that contains a CompareTo method. For example, the key parameter could be cast to IComparable:

public class Dictionary<K,V>
{
public void Add(K key, V value)
{
     ...

     if (((IComparable)key).CompareTo(x) < 0) {...}
     ...
}
}

While this solution works, it requires a dynamic type check at run-time, which adds overhead. It furthermore defers error reporting to run-time, throwing an InvalidCastException if a key doesn’t implement IComparable.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值