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中键入语义分析器需要最好猜测的疯狂内容时。