Я хотел бы ограничить общий код, который я кодирую, для всего, что может быть null
. Это в основном любой класс + System.Nullable
(например, int?
и т.д.).
Для части класса это довольно просто:
public class MyGeneric<T> where T : class {}
Но тогда это не позволяет мне это сделать:
var myGeneric = new MyGeneric<int?>();
или это:
var myGeneric = new MyGeneric<Nullable<int>>();
Компилятор жалуется:
ошибка CS0452: тип 'int?' должен быть ссылочным типом, чтобы использовать его в качестве параметра "T" в родовом типе или методе "Test.MyGeneric"
Итак, я попробовал addind System.Nullable
как принятые типы для T
:
public class MyGeneric<T> where T : class, System.Nullable {}
Но этого не будет. Компилятор возвращает следующую ошибку:
ошибка CS0717: "System.Nullable": статические классы не могут использоваться в качестве ограничений
Затем я попробовал
public class MyGeneric<T> where T : class, INullable {}
Он компилируется, но затем, когда я делаю:
var myGeneric = new MyGeneric<string>();
Компилятор возвращает эту ошибку:
error CS0311: Тип "string" не может использоваться как параметр типа "T" в родовом типе или методе "Test.MyGeneric". Нет никакого неявного преобразования ссылок из 'string' в 'System.Data.SqlTypes.INullable'.
Итак, вопрос в том, можно ли вообще ограничить родовое для всего, что может быть null
, и так, как?
Для справки, я использую VS2010/С# 4.0
изменить
Меня спросили, что я хочу с этим делать. Вот пример:
namespace Test
{
public class MyGeneric<T> where T : class
{
private IEnumerable<T> Vals { get; set; }
public MyGeneric(params T[] vals)
{
Vals = (IEnumerable<T>)vals;
}
public void Print()
{
foreach (var v in Vals.Where(v => v != default(T)))
{
Trace.Write(v.ToString());
}
Trace.WriteLine(string.Empty);
}
}
class Program
{
static void Main(string[] args)
{
MyGeneric<string> foo =
new MyGeneric<string>("a", "b", "c", null, null, "g");
foo.Print();
}
}
}
Эта программа печатает abcg
в консоли отладки.