Изучите этот маленький пример, и вы поймете, почему он не разрешен:
public void Test()
{
string s = "Hello";
Foo(out s);
}
public void Foo(out string s) //s is passed with "Hello" even if not usable
{
s = "Bye";
}
out
означает, что s
должно быть обязательно назначено до того, как выполнение покинет метод, и наоборот, вы не можете использовать s
, пока оно не будет определенно назначено в теле метода. Похоже, это совместимо с правилами ковариация . Но ничто не мешает вам присвоить s
на сайте вызова перед вызовом метода. Это значение передается методу, что означает, что даже если оно не пригодно для использования , вы фактически передаете параметр определенного типа методу, который идет вразрез с правилами ковариация , которые утверждают, что универсальный тип может использоваться только в качестве возвращаемого типа метода.