【问题标题】:C# XNA Xbox, in this case optional parameters are not optionalC# XNA Xbox,在这种情况下可选参数不是可选的
【发布时间】:2012-03-19 03:19:54
【问题描述】:

在 Xbox 上使用时,显然可选参数在 C# Xna 中不起作用,编译期间声明不支持。

我有这样的情况:

func(float? a = null, int? b = null)

使用大量默认为“未定义”值的这些可选参数,null。这种情况是必须的。

在上面的简化示例中,这可以展开,尽管这不是可选参数所允许的:

func()
func(float? a)
func(int? b)
func(float? a, int? b)

但是,对于大量参数,这是不切实际的。

参数定义的某些组合是不允许的,并且会导致通过函数的路径我抛出参数异常,其他会导致根据参数的值发生各种不同的事情。这类似于同名但不相同的函数之间的多态性。

我可以替代地,并且可能最实际地要求所有参数。

func(float? a, int? b)

然后这样调用:

func(null, 4)

第一个是未定义的。

有没有办法在 Xbox 上的 C# XNA 中启用可选参数,而不是使用上述任何一种?

【问题讨论】:

  • 您是否考虑过传入一个类对象而不是 15 个可能需要也可能不需要的参数?似乎这样可以解决您的问题并为您提供最大的灵活性。
  • 我必须构造类,然后可能在许多单独的代码行上定义它的一些参数,或者使用构造函数或其他本身具有可选参数的成员函数。这不是一个坏主意,对我来说不如可选参数好,但从没有必须保持不变的参数顺序的角度来看,与 func(null, 4) 解决方案相比非常好。

标签: c# parameters xna optional-parameters xbox


【解决方案1】:

我会使用带有不同数量参数的老式重载,并从那里转发调用以及“默认”值。调用者零代码更改。

如果类型超出您的控制范围:添加重载的扩展方法。

【讨论】:

  • 有困难的地方,例如模拟15个可选参数。
  • 在这种情况下,函数的 32,768 个版本似乎过多。
  • 如果能够在使用时按任何顺序定义也很好。
  • @alan 是的,不要全部写 15k - 但我怀疑实际上只有一个子集在使用
  • 谢谢,计算子集可能非常复杂,仍然是一个很长的列表,并且会更改函数更改的某些时间。我不会尝试这个:¬P 但感谢您的反馈。
【解决方案2】:

我当然已经在带有可选参数的 XBOX 上运行,但它需要对构建设置进行一些调整。但据我所知,它不适用于 WP7。

我认为这可能与所使用的语言版本有关。

查看以下链接:

http://msdn.microsoft.com/en-us/library/ff827884.aspx

http://forums.create.msdn.com/forums/p/54007/327944.aspx

【讨论】:

    【解决方案3】:

    我认为您不能启用可选参数。也许您可以使用替代方法。就像创建数组的 params 关键字一样,你可以只传递一个对象作为参数

    public class MyParams 
    {
         public float? a {get;set;}
         public int? b {get;set;}
    }
    
    func(new MyParams { b = 5 });
    

    使用该解决方案,您将拥有所需的所有灵活性。您可以添加、删除参数,而无需考虑添加/删除新的重载。如果你删除或编辑一个参数,你会得到一个编译时错误,你可能不会得到多重重载。

    【讨论】:

    • 这在 Xbox 360 上的 XNA 游戏中可能是不可接受的,在 Xbox 360 上分配内存通常是一个很大的禁忌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多