Это одна из немногих областей, где я думаю, C# пошел назад от C++.
В C++, вы можете написать
void foo(Bar& bar) { /*...*/ }
на достаточно четко указать, как компилятор и другие люди, которые foo
взяли реальный экземпляр Bar
. Да, можно - с усилием - передать foo
пустую ссылку, но это не совсем легальный C++.
Ваше единственное «решение» (своего рода) в C#, чтобы сделать ваши class
эс struct
s вместо этого, как типы значений в .NET не может быть null
(в вашем примере, б никогда не может быть null
потому что это System.Int32
). Вызов bar()
не будет компилироваться:
class A { }
struct B { }
static void foo(A a) { }
static void bar(B b) { }
static void Main(string[] args)
{
foo(null);
bar(null);
}
Это, конечно, кажется, что это было бы хорошо для C#, чтобы это сделали (много) более трудно иметь null
ссылки; Например, F # не имеет типов с нулевым значением.
Для некоторых интересных комментариев, относящихся к этому вопросу, читайте Null References: The Billion Dollar Mistake (и комментарии).
Edit: февраля 2013 сноска из Eric Lippert говорит:»... это просто так случилось, что, когда C# была впервые реализована она была всегда-NULLABLE ссылочные типы, ..., кажется вероятным, что Nullable<T>
может иметь были реализованы для работы с любым типом, а ссылочные типы по умолчанию были бы не нулевыми. Мы могли бы иметь систему типов, где Nullable<string>
был единственным законным способом представления «строки, которая может быть null
». ... »
Это почти точный дубликат: http://stackoverflow.com/questions/718630/not-nullable-types – BenAlabaster