bto*_*rdz 2 c# generics casting
我不明白为什么这不起作用,我可以直接进行double转换decimal,没有任何问题,但出乎意料的是,如果它在泛型类中,我不能做这个演员,这个片段更好地解释了它:
public class TestCollection<T>
{
public void Add(object value)
{
//When T is decimal, then I get
// System.InvalidCastException
var t = (T) value;
}
}
public void Main ()
{
var t = new TestCollection<decimal> ();
double doub = 10;
var decim = (decimal) doub; //Works!
t.Add(doub); //throws!
}
Run Code Online (Sandbox Code Playgroud)
用户代码未处理System.InvalidCastException HResult = -2147467262消息=指定的强制转换无效.Source = Wpf StackTrace:在Wpf.TestCollection`1.Add(对象值)中的C:\ Users\btord\Source\Repos\Live-Charts\Examples\Wpf\JimmyTheTestsGuy.xaml.cs:第15行,位于Wpf.JimmyTheTestsGuy. C:\ Users\btord\Source\Repos\Live-Charts\Examples\Wpf\JimmyTheTestsGuy.xaml.cs中的.ctor():C:\ Users\btord\Source中Wpf.MainWindow..ctor()的第35行\ Repos\Live-Charts\Examples\Wpf\MainWindow.xaml.cs:第56行InnerException:
它失败的原因与以下失败的原因完全相同:
short s = 1;
object o = s;
var i = (int)o; //Runtime error
Run Code Online (Sandbox Code Playgroud)
原因是盒装值只能拆分为真实类型.在你的情况下,你是拳击a double并试图将其拆箱到decimal.这是不允许的.
我会推迟整个设计.你有一个通用的Ts 集合.您的Add方法应该只接受Ts并让调用者承担转换为正确类型的负担.如果这不是一个有效的解决方案,那么一起摆脱泛型并简单地实现一组对象.
你可以用Convert.ChangeType它:
public void Add(object value)
{
var t = Convert.ChangeType(value, typeof(T));
}
Run Code Online (Sandbox Code Playgroud)
看小提琴:https://dotnetfiddle.net/0Tfgyz
| 归档时间: |
|
| 查看次数: |
373 次 |
| 最近记录: |