Почему операция не может быть выполнена как часть задания - PullRequest
0 голосов
/ 27 мая 2011

Недавно я случайно написал следующее утверждение:

MyCollection myCollection = new MyCollection();
SomeMethod(myCollection.SomeVoidOperation());

Глупо мне потребовалось некоторое время, чтобы понять, почему это не сработало (имел мозговый вылет), но потом это заставило меня задуматься;почему такое утверждение на самом деле недопустимо в любом общем контексте синтаксиса типа C?

Я понимаю, что могу выполнить те же функции с помощью цепочки методов, но я не понимаю, почему такая функция не (илиможет быть, не может быть реализовано?Мне кажется, что цель ясна, и я пытался, но не вижу никакой двусмысленности, которую это может создать.Я уверен, что есть несколько веских причин (или что-то, чего мне не хватает), и, надеюсь, кто-то может указать мне на это.

Итак, почему нельзя выполнить операцию как частьназначение?

ОБНОВЛЕНИЕ:
Я понимаю, почему это не работает.IE: у меня есть метод, который ожидает некоторый параметр, и я вызываю метод, который ничего не возвращает - но вы упускаете мою точку зрения ... Я вижу этот код как два утверждения, один из которых - myCollection (IE: экземпляр) ивторой - «вызвать этот метод».

Вот более полный пример:

public class Stock 
{
    public Guid ID { get; set; }
    public string Description { get; set; }
}

public class StockList : List<Stock>
{
    public void SomeSortOperation() { }
}

public void SomeMethod(StockList stockList)
{

}

StockList myList = new StockList();
SomeMethod(myList.SomeSortOperation());

Ответы [ 3 ]

4 голосов
/ 27 мая 2011

Это выглядит , как будто вы пытаетесь использовать результат SomeVoidOperation в качестве аргумента метода (предположительно, для метода без аргументов) - но, вероятно, это не так, потому что это метод void .

Никогда не было бы хорошей идеей, чтобы код выглядел как будто он делает одно, а на самом деле делает другое.

РЕДАКТИРОВАТЬ: Хорошо, нет, увидев редактирование, я все еще не думаю, что это хорошая идея. Вы в основном говорите, что если вы пытаетесь использовать выражение void в качестве аргумента метода, оно должно фактически использовать другое значение, основанное на выражении. Это выражение должно быть очень тщательно определено ... например, будет:

Foo(x.MethodReturningBar().MethodReturningVoid());

считать аргумент типом x или Bar (тип возврата промежуточного вызова метода)?

Опять же, вы пишете код, который выглядит как будто он делает одну вещь (используя значение всего выражения в качестве аргумента), когда на самом деле делает что-то другое (используя значение части выражения в качестве аргумента). Это просто плохая идея.

0 голосов
/ 27 мая 2011

Я считаю, что вы должны немного откатиться назад и попытаться сначала понять тип void. Смотрите этот ответ C # void type- safety . Я верю, что это поможет лучше понять, почему то, что вы пытаетесь сделать, не работает.

0 голосов
/ 27 мая 2011

Если вы подразумеваете под SomeVoidOperation () , что операция не возвращает значения (void):

Вы не можете ничего передать методу, который ожидает что-то получить.Вы не можете привести ничто к типу, который SomeMethod () ожидает получить.

...