C# 为什么一个操作可以’;不能作为任务的一部分执行

C# 为什么一个操作可以’;不能作为任务的一部分执行,c#,compiler-construction,programming-languages,syntax,C#,Compiler Construction,Programming Languages,Syntax,我最近无意中写了以下声明 MyCollection myCollection = new MyCollection(); SomeMethod(myCollection.SomeVoidOperation()); 愚蠢的是,我花了一些时间才弄明白为什么它不起作用(有个屁),但后来它让我思考;为什么这样的语句在任何通用C类型语法上下文中实际上都是无效的 我知道我可以通过方法链接实现相同的功能,但我不明白为什么这样的功能没有(或者可能无法)实现?对我来说,意图似乎很明确,我已经尝试过了,但我看不出

我最近无意中写了以下声明

MyCollection myCollection = new MyCollection();
SomeMethod(myCollection.SomeVoidOperation());
愚蠢的是,我花了一些时间才弄明白为什么它不起作用(有个屁),但后来它让我思考;为什么这样的语句在任何通用C类型语法上下文中实际上都是无效的

我知道我可以通过方法链接实现相同的功能,但我不明白为什么这样的功能没有(或者可能无法)实现?对我来说,意图似乎很明确,我已经尝试过了,但我看不出它可能造成任何歧义。我确信有一些很好的理由(或者我遗漏了什么),希望有人能告诉我

那么,为什么不能进行手术呢 作为任务的一部分执行

更新:
我明白为什么这样不行。IE:我有一个方法需要一些参数,我正在调用一个不返回任何内容的方法——但是你没有领会我的意思。。。。我将代码视为两条语句:一条是myCollection(即:实例),另一条是“调用此方法”

下面是一个更完整的示例:

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());
公共类股票
{
公共Guid ID{get;set;}
公共字符串说明{get;set;}
}
公共类库存清单:清单
{
public void somesortoOperation(){}
}
公共方法(库存清单库存清单)
{
}
StockList myList=新的StockList();
SomeMethod(myList.somesortoOperation());

如果您指的是SomeVoidOperation()操作不返回值(void):


您不能将任何内容传递给期望获得某些内容的方法。您不能将nothing强制转换为SomeMethod()期望得到的类型。

如果您指的是SomeVoidOperation()操作不返回值(void):

您不能将任何内容传递给期望获得某些内容的方法。您不能将nothing强制转换为SomeMethod()期望得到的类型。

看起来您试图将
SomeVoidOperation
的结果用作方法参数(可能是用于没有参数的方法),但可能不是,因为它是一个void方法

让代码看起来像在做一件事,而实际上却在做另一件事,这从来都不是一个好主意

编辑:好的,不,看过编辑后,我仍然认为这不是一个好主意。基本上是说,如果尝试使用void表达式作为方法参数,它实际上应该根据表达式使用不同的值。这个表达式必须非常仔细地定义。。。例如,将:

Foo(x.MethodReturningBar().MethodReturningVoid());
将参数视为
x
,或
Bar
(中间方法调用的返回类型)

同样,您编写的代码看起来像是在做一件事(使用整个表达式的值作为参数),而实际上它在做其他事情(使用部分表达式的值作为参数)。这简直是个坏主意。

看起来您试图将
SomeVoidOperation
的结果用作方法参数(可能是用于没有参数的方法),但可能不是,因为它是一个void方法

让代码看起来像在做一件事,而实际上却在做另一件事,这从来都不是一个好主意

编辑:好的,不,看过编辑后,我仍然认为这不是一个好主意。基本上是说,如果尝试使用void表达式作为方法参数,它实际上应该根据表达式使用不同的值。这个表达式必须非常仔细地定义。。。例如,将:

Foo(x.MethodReturningBar().MethodReturningVoid());
将参数视为
x
,或
Bar
(中间方法调用的返回类型)


同样,您编写的代码看起来像是在做一件事(使用整个表达式的值作为参数),而实际上它在做其他事情(使用部分表达式的值作为参数)。这简直是个坏主意。

我认为您应该回溯一点,首先尝试理解
void
类型。看看这个答案。我相信这会让你更深刻地理解为什么你试图做的事情不起作用。

我认为你应该先回溯一下,试着理解
void
类型。看看这个答案。我相信这会让您更清楚地了解为什么您尝试的操作不起作用。

哪种数据返回
myCollection.SomeVoidOperation()
?哪种数据接受
SomeMethod
作为输入参数?也许我没有抓住要点,但是
myCollection.SomeVoidOperation()
应该产生
SomeMethod
可以接受的结果。还是您试图传递一个void值?我认为这是因为编译器不需要参数。该语句将生成一个结果
void
,该结果可以看作一个参数。这只是一些推理,我对此没有任何参考。你的问题标题似乎完全不合适-这与无效表达有关,而不是作业。欢迎你更改它。这是我能想到的表达我想要达到的目标的最好方式。:-)哪种数据返回myCollection.SomeVoidOperation()?哪种数据接受
SomeMethod
作为输入参数?也许我没有抓住要点,但是
myCollection.SomeVoidOperation()
应该产生
SomeMethod
可以接受的结果。还是您试图传递一个void值?我认为这是因为编译器不需要参数。该语句将生成一个结果
void
,该结果可以看作一个参数。这只是一些推理,我对此没有任何参考。你的问题标题似乎完全不合适-这与无效表达有关,而不是作业。欢迎你更改它。这是我能想到的表达我想要达到的目标的最好方式。:-)但是如果这个方法