You need a subclass. Recently I needed something like that, this is my solution:
public abstract class MyGenericClass<T1, T2> { public abstract void Do(T1 param1, T2 param2); } public class Concrete : MyGenericClass<string, int?> { public override void Do(string param1, int? param2 = null) { Console.WriteLine("param1: {0}", param1); if (param2 == null) Console.WriteLine("param2 == null"); else Console.WriteLine("param2 = {0}", param2); Console.WriteLine("============================================="); } }
You can call the method:
string param1 = "Hello"; Concrete c = new Concrete(); c.Do(param1); c.Do(param1, 123); c.Do(param1, (int?)null); /* Result: param1: Hello param2 == null ============================================= param1: Hello param2 = 123 ============================================= param1: Hello param2 == null ============================================= */
I prefer to use null default values since i read this: C# In Depth – Optional Parameters and Named Arguments
ValueType, but by using thestructkeyword.)