我有以下示例代码。为什么我必须为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);
}
}
答案 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)
{
}
}
}