我正在修改一个工具,因为我希望能够使用泛型类型。 它具有“AsDouble”,“AsBool”等属性
我想强制进行类型转换,我不在乎它是否会在运行时抛出。我只想要它编译。</ p>
所以......这不会编译......
public T As<T>()
{
Type type = typeof(T);
if (type == typeof(Double))
{
return (T)(AsDouble);
}
// more conditionals
}
然而这确实......
public T As<T>()
{
Type type = typeof(T);
if (type == typeof(Double))
{
return (T)(AsDouble as object);
}
// more conditionals
}
为什么会这样?我如何让它停止抱怨,并按我的要求去做?或者,有什么比我想到的更好的方式吗?
//不重复建议的那个。 (Type1)Type2不起作用......我想知道为什么从T1转换到T2到T3工作但不是T1到T3。 (T1为双,T2为对象,T3为通用类型。)请在将其标记为重复之前阅读我的问题。
答案 0 :(得分:4)
如果T
没有任何类型约束,编译器将不知道要执行什么类型的转换,因为T
和double
之间的关系未知。我知道实现你想要的唯一方法是转换对象,这可能会生成一个box / unbox操作(它可能会得到优化,但我不确定)。
对于按类型I具有明确特化的通用方法,我采用了以下模式:
class Owner
{
class AsHelper<T>
{
public static Func<Owner, T> As;
}
static Owner()
{
AsHelper<double>.As = _ => _.AsDouble;
// Other implementations
}
public T As<T>() where T: struct
{
if(AsHelper<T>.As != null)
{
return AsHelper<T>.As(this);
}
else
{
// Default implementation or exception
return default(T);
}
}
}
这使专业化保持在他们自己的方法中。从我的性能测试来看,它与if基本方法大致相同。由于静态是.NET中的泛型类实例化,而不是每个泛型类定义,As
的{{1}}字段对于每个AsHelper<T>
具有不同的值