英文:
Optionally passing a struct to a custom function in C#
问题
以下是翻译好的部分:
有关此问题还有其他类似的Stack Overflow帖子,但我很难找到任何有意义的解决方案。在C#方面我还相对新手...
所以,我想做的只是向自定义函数添加一个可选参数。这个参数需要包含两个值,所以我想使用一个自定义结构体,像这样:
public struct FooBah {
public string foo;
public string bah;
public FooBah(string foo, string bah) {
this.foo = foo;
this.bah = bah;
}
}
然后在函数调用中使用它:
FooBah foobah = new FooBah("foo", "bah");
CustomFunction(foobah);
至于函数本身:
private void CustomFunction(FooBah foobah = null) {
if(foobah != null) {
// 使用foobah做一些操作
}
}
但是出现了以下错误:
不能将类型 '
' 的值用作默认参数,因为没有到类型 'FooBah' 的标准转换
请问有什么建议吗?
英文:
There are other similar SO posts on this, but I'm struggling to find anything that makes much sense. Still fairly new to C# here...
So, all I want to do is add an optional parameter to a custom function. This param needs to contain two values so I figured a custom struct would work, like this:
public struct FooBah {
public string foo;
public string bah;
public FooBah(string foo, string bah) {
this.foo = foo;
this.bah = bah;
}
}
Then to use it in a function call:
FooBah foobah = new FooBah("foo", "bah");
CustomFunction(foobah);
And for the function itself:
private void CustomFunction(FooBah foobah = null) {
if(foobah != null) {
// Do something with foobah
}
}
But this errors because:
> A value of type '<null>' cannot be used as a default parameter because there are no standard conversions to type 'FooBah'
Any advice please?
答案1
得分: 1
如果结构体有可检测到的默认状态(如 foo 为 null),您可以编写如下代码:
static void CustomFunction(FooBah foobah = default)
{
if (foobah.foo != null)
{
// 使用 foobah 进行操作
}
}
当然,这取决于您对 foo 的使用情况。
或者,您可以使用 FooBah? 参数:
static void CustomFunction(FooBah? foobah = null)
{
if (foobah == null)
{
// 使用 foobah 进行操作
}
}
以下调用都有效:
CustomFunction();
CustomFunction(new FooBah());
CustomFunction(null);
var fooBah = new FooBah();
CustomFunction(fooBah);
请注意,如果您不想在方法内部修改结构体,可以使用 in 修饰符:
static void CustomFunction(in FooBah? foobah = null)
{
if (foobah == null)
{
Console.WriteLine("默认");
}
else
{
Console.WriteLine("非默认");
}
}
请注意,在使用可空值类型时,必须通过 .Value 属性访问值本身,即 foobah.Value.foo - 这是因为类型是 Nullable<FooBah> 而不是 FooBah。
最后,最明显的解决方案是重载方法,有参数和无参数两种情况。
英文:
If there is a default state for the struct that you can detect (such as foo being null) you can write code like this:
static void CustomFunction(FooBah foobah = default)
{
if (foobah.foo != null)
{
// Do something with foobah
}
}
Of course this depends on your usage of foo.
Alternatively you can use a FooBah? parameter:
static void CustomFunction(FooBah? foobah = null)
{
if (foobah == null)
{
// Do something with foobah
}
}
The following calls all work:
CustomFunction();
CustomFunction(new FooBah());
CustomFunction(null);
var fooBah = new FooBah();
CustomFunction(fooBah);
Note that if you don't want to modify the struct inside the method you can use the in modifier:
static void CustomFunction(in FooBah? foobah = null)
{
if (foobah == null)
{
Console.WriteLine("Default");
}
else
{
Console.WriteLine("Not default");
}
}
Note that when using a nullable value type, you must access the value itself via a .Value property, i.e. foobah.Value.foo - this is because the type is Nullable<FooBah> rather than FooBah.
See here for the Nullable value type documentation
See here for more information on when you should use in.
Finally the most obvious solution is to overload the method with and without a parameter.
答案2
得分: 1
This could work, but your structure is not nullable, as in it can't be converted to null, hence, you could do it like this to define an optional argument -
这个方法可能可行,但是你的结构体是不可为空的,也就是不能转换为null,因此,你可以像这样定义一个可选参数 -
public struct FooBah {
public string foo;
public string bah;
public FooBah(string foo, string bah) {
this.foo = foo;
this.bah = bah;
}
}
FooBah foobah = new FooBah("foo", "bah");
CustomFunction(foobah);
private void CustomFunction(FooBah? structOptional = null){
//What you want to do with the struct
}
英文:
This could work, but your structure is not nullable, as in it can't be converted to null, hence, you could do it like this to define an optional argument -
public struct FooBah {
public string foo;
public string bah;
public FooBah(string foo, string bah) {
this.foo = foo;
this.bah = bah;
}
}
FooBah foobah = new FooBah("foo", "bah");
CustomFunction(foobah);
private void CustomFunction(CustomFunction? structOptional = null){
//What you want to do with the struct
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论