Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# 是否可以强制类型参数在类上为null_C#_Generics_Nullable - Fatal编程技术网

C# 是否可以强制类型参数在类上为null

C# 是否可以强制类型参数在类上为null,c#,generics,nullable,C#,Generics,Nullable,给定一个类定义,如: public class Test<T> { T _value; public void Test(T value) { _value = value; } public void DoStuff() { if(_value.HasValue) { //stuff } } } 公共类测试 { T_值; 公共空隙试

给定一个类定义,如:

public class Test<T>
{
    T _value;

    public void Test(T value)
    {
        _value = value;
    }

    public void DoStuff()
    {
        if(_value.HasValue)
        {
            //stuff
        }
    }
 }
公共类测试
{
T_值;
公共空隙试验(T值)
{
_价值=价值;
}
公共空间
{
if(_value.HasValue)
{
//东西
}
}
}
我希望强制T可以为null,这样我就可以使用如下类:

//does stuff
new Test<int?>(3).DoStuff();
//doesn't do stuff
new Test<int?>(null).DoStuff();
//做一些事情
新试验(3)DoStuff();
//什么都不做
新测试(null).DoStuff();

是,只需使用
T?
Nullable
作为类型参数即可

然后,您的示例变成:

//does stuff
new Test<int>(3).DoStuff();
//doesn't do stuff
new Test<int>(null).DoStuff();
//做一些事情
新试验(3)DoStuff();
//什么都不做
新测试(null).DoStuff();
您可以尝试:-

public class Test<Nullable<T>>
公共类测试

您不能强制执行
t
本身是可为空的值类型,不。但是,您可以强制执行
t
是不可为空的值类型,然后在类中的任何位置使用
t?

public class Test<T> where T : struct
{
    T? _value;

    public void Test(T? value)
    {
        _value = value;
    }

    public void DoStuff()
    {
        if(_value.HasValue)
        {
            //stuff
        }
    }
 }
公共类测试,其中T:struct
{
T?u值;
公共空隙试验(T?值)
{
_价值=价值;
}
公共空间
{
if(_value.HasValue)
{
//东西
}
}
}

另一个特点是,您不能将
t
约束为包括引用类型在内的任何可空类型,同样,您也不能将
t
约束为包括可空值类型在内的任何值类型。
where T:class
约束仅适用于类(包括委托类型)和接口,而
where T:struct
约束仅适用于不可为空的值类型(包括枚举)。

可为空的类型基本上是从类型
可为空的
派生而来的。你能基于
Nullable
定义你的接口吗?

不,它们不是从
Nullable
派生的。它们不可能是空的,因为
可以为空
是一个结构。它们也不是从
Nullable
类派生的,后者是一个静态类。True。我用词不当。我基本上是想问API不能用“Nullable”来定义。我很想知道DoStuff()中需要泛型类型的东西是什么?或者你可以?不,你不能(只是检查一下)。对我来说有道理!仅供参考,在可空类型的原始设计和实现中,语言设计者考虑允许可空类型的可空性,但最终决定将其取缔。然而,编译器中仍然有处理它的代码,因为这些场景确实出现在错误案例中,或者当人们在IDE中键入语义分析器需要最好猜测的疯狂内容时。