使用通用函数参数的默认值

时间:2013-11-01 17:27:49

标签: c# generics

有没有办法限制T的输入以便能够为函数参数添加默认值?

public class Identity<T>
{
    public readonly T Seed;
    public readonly T Increment;

    public Identity(T seed = 1, T increment = 1)
    {
        Seed = seed;
        Increment = increment;
    }
}

我希望能够做T seed = 1并且可能将T限制为非十进制数字类型,如short,int,long ......

2 个答案:

答案 0 :(得分:1)

您只能设置可在编译时评估的“默认”值,并且可以转换为T的所有可能值。一个示例是使用default

public void Add(T parent = default(T))
{
    ....
}

哪种情况不适用于您的情况,除非您想将“0”视为“魔术”案例并将其视为“1”。但是如何在不将T限制为数值的情况下实现它? (你也不能用泛型)

答案 1 :(得分:0)

实际问题是(可能)根本没有办法为T类型的参数指定默认值。

IF 你可以做到(我不记得了),而不是 指定:

T param1 = null       // for T: class
T param1 = default(T) // for T: any
// T param1 = new T()    // for T: new()  -- cannot be possible, see Servy's comment

因为没有其他“构造函数”可用于泛型类型参数T!

编译器将T视为没有操作且没有构造函数的对象,除了where子句和/或总是从{{1}继承的子句之外没有强制转换/转换}。由于您只能指定上述操作/要求..我认为无法完成。泛型不是C ++模板;)