1

有没有办法限制输入 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 限制为非十进制数字类型,如短、整数、长......

4

2 回答 2

1

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

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

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

于 2013-11-01T17:42:19.810 回答
0

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

如果你能做到(我不记得了),那么你只能指定:

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子句和/或始终继承自object. 由于您只能指定上述操作/要求..我认为它无法完成。泛型不是 C++ 模板;)

于 2013-11-01T17:39:55.970 回答