将T从和铸造到通用<;T>;(C#)

将T从和铸造到通用<;T>;(C#),c#,generics,casting,C#,Generics,Casting,所以我有一个泛型类,类型是它的泛型参数。在这个类中有一个方法,它有一个名为value的对象参数。有点像这样: public class Foo<Type> where Type : IComparable { public void Bar(object value) { DoSomething((Type)value); } } 在这种情况下,“DoSomething((Type)value)”是类型为GenericType,值为Numbe

所以我有一个泛型类,类型是它的泛型参数。在这个类中有一个方法,它有一个名为value的对象参数。有点像这样:

public class Foo<Type> where Type : IComparable
{
    public void Bar(object value)
    {
        DoSomething((Type)value);
    }
}
在这种情况下,“DoSomething((Type)value)”是类型为GenericType,值为Number.Zero。由于某些原因,这会导致强制转换引发InvalidCastException:指定的强制转换无效。当我直接尝试时,我的意思是

GenericType<Number> z = (GenericType<Number>)Number.Zero; 
GenericType z=(GenericType)Number.Zero;

…它有效(我知道,甚至不需要显式转换)。但由于某些原因,它在我上面提到的复杂示例中不起作用。有人能帮我理解并解决这个问题吗?

为什么不让您的类使用泛型类型呢

public class Foo<T> where T : IComparable
{
    public void Bar(T value)
    {
        DoSomething(value);
    }
}
公共类Foo其中T:i可比较
{
公共空栏(T值)
{
剂量(值);
}
}

不需要铸造。。。请不要使用保留字来命名内容。

这是因为强制转换是一种编译器功能,编译器不会验证可以替换
泛型参数的所有可能类型是否都有强制转换运算符。如果需要在运行时动态地执行强制转换,则假设您提供了可以强制转换的值,那么您可以使用
dynamic
而不是
object
。然而,整个前提似乎是错误的,为什么不从
Bar
开始使用
Type
参数?我强烈建议您不要命名类型参数
Type
。步骤1。尽可能避免铸造。步骤2:在需要泛型中特定的类型时,使用泛型类型约束。第三步???第四步。ProfitAlso知道
(SomeValueType)objectValue
被称为unboxing,不强制转换或转换任何内容,它只在
objectValue
中的值实际上是
SomeValueType
时起作用,底层类型是否可以强制转换为
SomeValueType
并不重要。同样,你的整个前提似乎都错了。@LasseVågsætherKarlsen我不打算全部重做,因为这甚至不是我的工作——我只是添加了一个需要的功能。不过,将对象更改为动态有帮助,感谢您的帮助和我的新信息,我肯定会找到一些关于动态关键字的文章,因为我以前从未使用过它。
GenericType<Number> z = (GenericType<Number>)Number.Zero; 
public class Foo<T> where T : IComparable
{
    public void Bar(T value)
    {
        DoSomething(value);
    }
}