class Program
{
static void Main(string[] args)
{
Console.WriteLine(SomeFunction<int>()==null);
var temp = new SomeClass<int>();
Console.WriteLine(temp.SomeFunction() == null);
Console.ReadKey();
}
static public T? SomeFunction<T>() where T : struct
{
return null;
}
public class SomeClass<T> where T : struct
{
public T? SomeFunction()
{
return null;
}
}
}
在上面的例子中,为什么可空类型需要结构约束?
我不明白为什么struct是正确的语法而不是对象或类。
答案 0 :(得分:8)
因为Nullable<T>
(或T?
)也将T
限制为结构。
因此,要使SomeFunction<T>
的通用类型参数T
满足Nullable<T>
的要求,SomeFunction<T>
必须也声明相同的约束
以下是约束必须传播的另一个例子:
interface ISomeInterface { }
class MyClass<T> where T: ISomeInterface { }
class Program
{
//MyClass's constaints must be "re-declared" here
public MyClass<T> SomeFunction<T>() where T : ISomeInterface
{
}
}
为什么Nullable<T>
会这样做?因为可以为空的引用类型没有任何意义。 Refence类型 已经可以为空。
答案 1 :(得分:2)
T?
是Nullable<T>
的简写,Nullable<T>
要求T
为结构:
public struct Nullable<T> where T : struct
答案 2 :(得分:0)
Nullable<T>
是一个结构(参见MSDN)但是它是唯一不满足结构约束的结构。另外,当使用类或结构约束时,不能将Nullable用作泛型类型参数。
Nullable<T>
的基本思想是拥有一个可以包含T的存储位置,或者可以代表&#34;该值缺失&#34;