Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用通用函数参数的默认值_C#_Generics - Fatal编程技术网

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

C# 使用通用函数参数的默认值,c#,generics,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的键入,以便能够向函数参数添加默认值

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种子;
公共只读T增量;
公共标识(T种子=1,T增量=1)
{
种子=种子;
增量=增量;
}
}

我想做的是
T seed=1
,可能会将T限制为short、int、long等非十进制数字类型。

实际问题是(可能)根本无法为类型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
子句和/或总是从
对象继承的子句指定之外,该对象没有任何操作、构造函数和强制转换/转换。因为您只能指定上述操作/要求。。我认为这是不可能的。泛型不是C++模板;p> 实际问题是(可能)根本没有办法为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
子句和/或总是从
对象继承的子句指定之外,该对象没有任何操作、构造函数和强制转换/转换。因为您只能指定上述操作/要求。。我认为这是不可能的。泛型不是C++模板;p> 您只能设置“默认”值,这些值可以在编译时计算,并且可以转换为T的所有可能值。一个示例是使用
default

public void Add(T parent = default(T))
{
    ....
}
这不适用于您的案例,除非您希望将“0”视为“魔术”案例,并将其视为“1”。但是,在不将T限制为数值的情况下,如何实现它呢?(您也不能使用泛型)

您只能设置“默认”值,这些值可以在编译时进行计算,并且可以转换为t的所有可能值。一个示例是使用
default

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

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

感觉这可能得益于一些额外的抽象,请看类似的问题/答案:我确实认为你可以用另一种方式来做这件事,尽管如果不看你是如何使用它的,很难确切地说它可能是什么形状。也许从实现IKeyField或其他什么开始?这不是重复的!OP希望能够在泛型类的参数定义中使用默认值!虽然,事实上,这个问题部分回答了“它不可能完成”,因为你不能将T限制为数字,但它不是一个“足够重复的问题”。@quetzalcatl这个问题还说,“我希望能够完成,也许可以将T限制为非十进制数字类型,如short、int、long”,为了使给定的默认参数合理,需要这样做。感觉这可能会从一些额外的抽象中受益,请参见类似的问题/答案:我确实认为您可以用另一种方式来解决这个问题,虽然没有看到你是如何使用它的,但很难说它到底是什么形状。也许从实现IKeyField或其他什么开始?这不是重复的!OP希望能够在泛型类的参数定义中使用默认值!虽然,事实上,这个问题部分回答了“它不可能完成”,因为你不能将T限制为数字,但它不是一个“足够重复的问题”。@quetzalcatl这个问题还说,“我希望能够完成,也许可以将T限制为非十进制数字类型,如short、int、long”,为了使给定的默认参数合理,需要执行该操作。默认值必须是文本。您列出的前两个选项是文本,因此它们可以很好地工作(尽管
null
要求类型可以为null,这意味着类约束)。第三个不是,所以不会。没有其他文本可以分配给
T
,但是如果语言中添加了任何文本,则无需更改默认参数的规范。谢谢!这是真的,我没有注意到这一点,因为我是从非常笼统的角度来思考的。关于您的澄清,我将做一个说明。默认值必须是文字。您列出的前两个选项是文本,因此它们可以很好地工作(尽管
null
要求类型可以为null,这意味着类约束)。第三个不是,所以不会。没有其他文本可以分配给
T
,但是如果语言中添加了任何文本,则无需更改默认参数的规范。谢谢!这是真的,我没有注意到这一点,因为我是从非常笼统的角度来思考的。我会记下你的澄清。