C#值类型相关疑问:这是否是编译器Bug?
C#值类型相关疑问:这是否是编译器Bug?
嘿,各位C#开发者们,最近我在给数值类型扩展方法时碰到了个闹心的问题,想请教下这会不会是编译器的Bug?
我本来想做个扩展方法,让Abs能作为所有实现INumberBase<T>的类型的实例方法来用,于是写了这么一段代码(原本的代码末尾有点截断,我把合理的部分补全了):
public static class MathIntExtensions { /// <summary> /// Exposes Abs as extension method for all INumberBase types. /// </summary> /// <typeparam name="TIn"></typeparam> /// <param name="number"></param> /// <returns></returns> public static TIn Abs<TIn>(this TIn number) where TIn : INumberBase<TIn> { return TIn.Abs(number); } }
可奇怪的事情发生了:当我用int、float这些内置值类型去调用这个Abs()扩展方法时,编译器要么提示找不到匹配的方法,要么直接绕开我的扩展,去调用Math类里的静态Abs方法。但明明这些内置数值类型都实现了INumberBase<T>接口啊,按道理应该能匹配上我的扩展方法才对。
我翻来覆去检查了泛型约束,也确认了扩展类的访问权限没问题,可内置值类型就是不认这个扩展方法。换成我自己写的、实现了INumberBase<T>的自定义值类型时,反而能正常调用。
这就让我犯嘀咕了——会不会是编译器在处理内置值类型和泛型扩展方法的匹配逻辑时出了问题?有没有大佬碰到过类似的情况,或者能帮我捋捋这到底是咋回事?
内容来源于stack exchange
相关产品推荐
相关产品推荐

