Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# dotnet返回2种类型中的1种_C#_.net - Fatal编程技术网

C# dotnet返回2种类型中的1种

C# dotnet返回2种类型中的1种,c#,.net,C#,.net,我有一个简单的方法设置来创建条目,如果成功,返回创建的条目。如果没有返回ValidationError public async Task<MyNewEntry> CreateEntry(MyUser user, MyEntryRequest entry) 公共异步任务CreateEntry(MyUser用户,MyEntryRequest条目) 如果条目有效,这将非常有效。但是,如果验证失败,我想返回ValidationError 我试着这样做: public async Tas

我有一个简单的方法设置来创建条目,如果成功,返回创建的条目。如果没有返回ValidationError

public async Task<MyNewEntry> CreateEntry(MyUser user, MyEntryRequest entry)
公共异步任务CreateEntry(MyUser用户,MyEntryRequest条目)
如果条目有效,这将非常有效。但是,如果验证失败,我想返回ValidationError

我试着这样做:

public async Task<MyNewEntry | ValidationError> CreateEntry(MyUser user, MyEntryRequest entry)
公共异步任务CreateEntry(MyUser用户,MyEntryRequest条目)

但它不会编译。如何构造此方法,使其能够返回
MyNewEntry
ValidationError

要执行此操作,您可以使用一个结果类型,它由一个属性“bool Success”和一个错误以及一个条目属性组成,该属性始终只有一个值填充,取决于你的方法是否成功

public class CreateEntryResult
{
    public bool Success {get;set;}
    public MyNewEntry Entry {get;set;}
    public ValdidationError Error {get;set;}
}
为了节省一些内存(您将在每个结果上创建一个额外的对象),您还可以返回一个struct。只需将代码中的“class”关键字替换为“struct”。然后,包含的引用将作为值传递,您不必考虑对垃圾收集的任何影响

另一种方法是“Try”模式,近年来我很少看到这种方法,在这种模式中,您返回一个结果类型(通常是bool)并使用out参数返回值。 我不知道out参数如何与async一起工作

bool TryCreateEntry(..., out MyNewEntry entry, out ValidationError error)

哎呀,没有什么内置的。您可以将它们包装在一个结构中(比如),或者将验证错误包装在一个异常中,或者将一个作为out参数返回,如果设置了,则将另一个作为null返回,但我不确定它们是否都是超级干净的。返回两种不同的类型通常是个坏主意。您只需在MyNewEntry类中设置一个表示成功或失败的“有效”标志即可。我想我只需要创建一个知道如何处理它的包装器类?家长班?听起来你真的应该抛出一个异常。验证失败不是编译时可以解决的问题这将是异常驱动的设计,考虑到异常对应用程序的影响,在任何情况下都应该避免这种情况。当您知道可能发生的情况时,避免抛出异常。验证结果,无论是什么样的,都不是例外。