为什么在泛型类中使用枚举时必须指定类型参数

时间:2015-04-14 15:05:35

标签: c# .net generics enums

我有以下示例代码。为什么我必须为T指定一个类型?这是我可以利用的东西吗?我不明白为什么枚举定义依赖于类型参数?根据类型,枚举的内容怎么样?因此,在我的语法糖方面,我希望将类型的定义排除在外。

public class SomeGenericClass<T>
{
    public enum InitialisationMode
    {
        UseDefaultValues,
        DoOtherThings
    }

    public SomeGenericClass(InitialisationMode initMode = InitialisationMode.UseDefaultValues)
    {

    }
}

public class SomeOtherClass
{
    public void DoAction()
    {
        //Why do I have to specify the generic type arguments when using the enum value?
        var genericClass = new SomeGenericClass<int>(SomeGenericClass<int>.InitialisationMode.DoOtherThings);
        //I Would expect to be able to use the enum like the line below:
        genericClass = new SomeGenericClass<int>(SomeGenericClass.InitialisationMode.DoOtherThings);
    }
}

我知道我可以通过做这样的事情来解决这个问题,或者将枚举范围放在一起:

public class SomeGenericClass<T>
{
    public SomeGenericClass(SomeGenericClass.InitialisationMode initMode = SomeGenericClass.InitialisationMode.UseDefaultValues)
    {

    }
}

public abstract class SomeGenericClass
{
    public enum InitialisationMode
    {
        UseDefaultValues,
        DoOtherThings
    }
}

public class SomeOtherClass
{
    public void DoAction()
    {
        //I Would expect to be able to use the enum like the line below:
        var genericClass = new SomeGenericClass<int>(SomeGenericClass.InitialisationMode.DoOtherThings);
    }
}

1 个答案:

答案 0 :(得分:4)

因为你的enum生活在那个类中,并且有可能(如果不是非常实际的话)让不同类型的枚举不同:

class Program
{
    static void Main(string[] args)
    {
        var sgc = new SomeGenericClass<string>("asdf");

        var sgc2 = new SomeGenericClass<int>(1);

        var sgc3 = new SomeNonGenericChild("asdf2");
        Console.ReadKey();
    }
}

public class SomeGenericClass<T>
{
    public enum InitialisationMode
    {
        UseDefaultValues,
        DoOtherThings = 3
    }


    public SomeGenericClass(T blah, InitialisationMode initMode = InitialisationMode.UseDefaultValues)
    {

        Console.WriteLine(blah.GetType().Name + "; " + initMode);
    }
}

public class SomeNonGenericChild : SomeGenericClass<string>
{
    public new enum InitialisationMode
    {
        UseDefaultValues,
        DoEvenMoreThings
    }

    public SomeNonGenericChild(string blah, InitialisationMode initMode= InitialisationMode.DoEvenMoreThings) : base(blah)
    {

        Console.WriteLine(blah.GetType().Name + "; " + initMode);
    }
}

要实现您想要的语法,您可以执行以下操作:

namespace SomeNamespace
{
    public enum InitialisationMode
    {
        UseDefaultValues,
        DoOtherThings
    }
    public class SomeGenericClass<T>
    {

        public SomeGenericClass(InitialisationMode initMode = InitialisationMode.UseDefaultValues)
        {

        }
    }
}