从通用到通用的铸造T. (C#)

问题描述 投票:-4回答:1

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

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);
}

我们说,值是一个枚举

public enum Number: short
{
    Zero = 0,
    One = 1,
    Two = 2
}

在这种情况下,'DoSomething((Type)value''是Type为GenericType,值为Number.Zero。由于某种原因,这会导致强制转换抛出InvalidCastException:指定的强制转换无效。当我直接尝试时,我的意思是..

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

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

c# generics casting
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.