Я хотел бы ограничить общий код, который я кодирую, всем, что может быть 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>();
Компилятор возвращает эту ошибку: ошибка CS0311: тип 'строка' нельзя использовать в качестве параметра типа 'T' в универсальном типе или методе 'Test.MyGeneric'.Не существует неявного преобразования ссылок из 'string' в 'System.Data.SqlTypes.INullable'.
Итак, вопрос заключается в следующем: возможно ли вообще ограничить универсальный тип чем-либо, что может быть null
, ну и как?
Для справки я использую VS2010 / C # 4.0
edit Меня спросили, что я хочу с этим делать.Вот пример:
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
в консоли отладки.