【发布时间】:2018-01-03 15:34:32
【问题描述】:
所以我有一个泛型类,Type 作为它的泛型参数。在这个类中是一个方法,它具有称为值的对象参数。有点像这样:
public class Foo<Type> where Type : IComparable
{
public void Bar(object value)
{
DoSomething((Type)value);
}
}
如您所见,我需要先将值(存储在对象中)“DoSomething”转换为 Type。我什至有自己的覆盖演员表,它可以自己工作。
在这个特定的情况下,Type 是通用的,我们称之为 GenericType,并且有这个用户定义的转换:
public static implicit operator GenericType<T>(T value)
{
return new GenericType<T>(value);
}
value 是一个枚举,比如说
public enum Number: short
{
Zero = 0,
One = 1,
Two = 2
}
在这种情况下,“DoSomething((Type)value)”的类型是 GenericType,值是 Number.Zero。出于某种原因,这会导致强制转换抛出 InvalidCastException: Specified cast is not valid。当我直接尝试时,我的意思是..
GenericType<Number> z = (GenericType<Number>)Number.Zero;
..它有效(我知道,甚至不需要显式转换)。但是由于某种原因,它在我上面提到的复杂示例中不起作用。谁能帮助我理解并可能解决这个问题?
【问题讨论】:
-
这是因为 casting 是 compiler 的事情,并且编译器不会验证所有可能的类型都可以替代您的
<Type>泛型参数有一个强制转换运算符。如果您需要在运行时动态地进行转换,假设您提供了一个可以转换的值,那么您可以使用dynamic而不是object。然而整个前提似乎是错误的,为什么Bar不以Type的参数开头? -
我强烈建议你不要将你的类型参数命名为
Type。 -
第 1 步。尽可能避免投射。第 2 步:在需要在泛型中指定类型的任何地方使用泛型类型约束。第三步。???第 4 步。利润
-
也知道
(SomeValueType)objectValue被称为 unboxing 并且不会强制转换或转换任何内容,它只有在objectValue中的值实际时才有效b> 一个SomeValueType,底层类型可以转换为SomeValueType没关系。再说一次,你的整个前提似乎是错误的。 -
@LasseVågsætherKarlsen 我不会全部重做,因为它甚至不是我的工作——我只是添加一个需要存在的功能。但是,将对象更改为动态有帮助,感谢您的帮助和对我的新信息,我肯定会找到一些关于动态关键字的文章,因为我以前从未使用过它。