【问题标题】:Casting T from and to Generic<T> (C#)将 T 从和转换为 Generic<T> (C#)
【发布时间】: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; 

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

【问题讨论】:

  • 这是因为 castingcompiler 的事情,并且编译器不会验证所有可能的类型都可以替代您的&lt;Type&gt; 泛型参数有一个强制转换运算符。如果您需要在运行时动态地进行转换,假设您提供了一个可以转换的值,那么您可以使用dynamic 而不是object。然而整个前提似乎是错误的,为什么Bar 不以Type 的参数开头?
  • 我强烈建议你不要将你的类型参数命名为Type
  • 第 1 步。尽可能避免投射。第 2 步:在需要在泛型中指定类型的任何地方使用泛型类型约束。第三步。???第 4 步。利润
  • 也知道 (SomeValueType)objectValue 被称为 unboxing 并且不会强制转换或转换任何内容,它只有在 objectValue 中的值实际时才有效b> 一个SomeValueType,底层类型可以转换为SomeValueType 没关系。再说一次,你的整个前提似乎是错误的。
  • @LasseVågsætherKarlsen 我不会全部重做,因为它甚至不是我的工作——我只是添加一个需要存在的功能。但是,将对象更改为动态有帮助,感谢您的帮助和对我的新信息,我肯定会找到一些关于动态关键字的文章,因为我以前从未使用过它。

标签: c# generics casting


【解决方案1】:

为什么不让你的类使用泛型类型?

public class Foo<T> where T : IComparable
{
    public void Bar(T value)
    {
        DoSomething(value);
    }
}

无需强制转换...请不要使用保留字来命名。

【讨论】:

    猜你喜欢
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    相关资源
    最近更新 更多