代码之家  ›  专栏  ›  技术社区  ›  Gord

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

  •  4
  • Gord  · 技术社区  · 15 年前

    给定一个类定义,如:

    public class Test<T>
    {
        T _value;
    
        public void Test(T value)
        {
            _value = value;
        }
    
        public void DoStuff()
        {
            if(_value.HasValue)
            {
                //stuff
            }
        }
     }
    

    我希望强制T可以为null,这样我就可以使用如下类:

    //does stuff
    new Test<int?>(3).DoStuff();
    //doesn't do stuff
    new Test<int?>(null).DoStuff();
    
    4 回复  |  直到 15 年前
        1
  •  6
  •   Jon Skeet    15 年前

    你不能强制执行 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
            }
        }
     }
    

    另一个特点是您无法约束 成为 可为null的类型,包括引用类型-同样,您不能约束 成为 值类型,包括可为空的值类型。这个 where T : class 约束仅适用于类(包括委托类型)和接口,并且 where T : struct 仅具有不可为null的值类型(包括枚举)的约束。

        2
  •  0
  •   Joaquim Rendeiro    15 年前

    T? Nullable<T> 作为类型参数。

    然后,您的示例变成:

    //does stuff
    new Test<int>(3).DoStuff();
    //doesn't do stuff
    new Test<int>(null).DoStuff();
    
        3
  •  0
  •   Adam Ralph    15 年前

    你可以试试:-

    public class Test<Nullable<T>>
    
        4
  •  0
  •   Martin Peck    15 年前

    Nullable<T> . 你能根据这些定义你的界面吗 ?