English 中文(简体)
Is it possible to enforce that a type param is nullable on a class
原标题:

given a class definition like:

public class Test<T>
{
    T _value;

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

    public void DoStuff()
    {
        if(_value.HasValue)
        {
            //stuff
        }
    }
 }

I would like to enforce that T is nullable so I can use the class like:

//does stuff
new Test<int?>(3).DoStuff();
//doesn t do stuff
new Test<int?>(null).DoStuff();
最佳回答

You can t enforce that T itself is a nullable value type, no. You can enforce that T is a non-nullable value type, however - and then use T? everywhere in the class.

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

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

    public void DoStuff()
    {
        if(_value.HasValue)
        {
            //stuff
        }
    }
 }

One other peculiarity is that you can t constrain T to be any nullable type including reference types - and likewise you can t constrain T to be any value type including nullable value types. The where T : class constraint only works with classes (including delegate types) and interfaces, and the where T : struct constraint only with non-nullable value types (including enums).

问题回答

Yes, just use T? or Nullable<T> as type parameter.

Then your sample becomes:

//does stuff
new Test<int>(3).DoStuff();
//doesn t do stuff
new Test<int>(null).DoStuff();

You could try:-

public class Test<Nullable<T>>

Nullable types are essentially derived from the type Nullable<T>. Could you define your interface based upon Nullable<T>?





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签