繁体   English   中英

通用十进制不能从double转换

[英]Generic decimal can't cast from double

我不明白为什么这不起作用,我可以直接从doubledecimal没有问题,但出乎意料的是,如果它在泛型类中,我不能这样做,这个片段更好地解释了它:

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!
}

用户代码未处理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

原因是盒装值只能拆分为真实类型。 在你的情况下,你正在拳击一个double并试图将其拆箱到decimal 这是不允许的。

我会推迟整个设计。 你有一个T的通用集合。 您的Add方法应该只接受T s并让调用者承担转换为正确类型的负担。 如果这不是一个有效的解决方案,那么一起摆脱泛型并简单地实现一组对象。

您可以使用Convert.ChangeType

public void Add(object value)
{
    var t = Convert.ChangeType(value, typeof(T));
}

看小提琴: https//dotnetfiddle.net/0Tfgyz

如果需要T的对象插入,则可以在Add方法中使用dynamic。

 public void Add(object value)
 {
      //When T is decimal, then I get 
      // System.InvalidCastException
      dynamic t1 = value;
      var t = (T)t1;
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM