是否可以将泛型重载限制为属性类型?
问题描述:
的问题是,我可以以某种方式限制泛型重载严格物业类型.. 现在还不清楚,所以这里有一个例子:是否可以将泛型重载限制为属性类型?
我有一些类
public class Obj
{
public double Width { get; set; }
public float WidthF { get; set; }
}
和一些扩展它
public static class TestGenericOverride
{
public static void Do<TObj, TProp>(this TObj src,
Expression<Func<TObj, TProp>> expr, TProp val)
{
Console.WriteLine("Do: typeof(TProp) = {0}", typeof(TProp).Name);
}
}
,这是主要
static void Main(string[] args)
{
var o = new Obj();
o.Do(p => p.Width, 100); //1: typeof(TProp) = Double
o.Do(p => p.Width, 100.0); //2: typeof(TProp) = Double
o.Do(p => p.WidthF, 100); //3: typeof(TProp) = Single
o.Do(p => p.WidthF, 100.9); //4: typeof(TProp) = Double
Console.ReadLine();
}
我想要的是让最后的呼叫(#4)不可用。可能吗?
换句话说: 如果在表达属性类型是浮动的,我想,只有浮动过载可用,没有双超载
谢谢!
答
这将做的工作:
public static void Do<TObj, TProp, TValue>(this TObj src,
Expression<Func<TObj, TProp>> expr, TValue val) where TValue: TProp
{
Console.WriteLine("Do: typeof(TProp) = {0}", typeof(TProp).Name);
}
新的值必须是同一类型的物业。这意味着不仅#4不起作用,而且还#1和#3因为和int不是浮动。隐式转换不允许使用此扩展名。
你不能。你将不得不施放,例如:o.Do(p =>(double)p.WidthF,100.9);' – leppie
@leppie 似乎你说'o.Do(p =>(float)p.WidthF,100.9 )',因为双重过载将被自动调用。 (默认情况下100.9字面值是双倍)。 或者我们可以编写'o.Do(p => p.WidthF,100.9F)' – garek
您的问题仅限于double/float还是这是一个通用示例? –