如何在某个函数或子函数中声明一个可选的颜色参数,就像我以正常方式那样(我的意思是为该可选参数提供一些默认颜色),因为vb.net编译器抱怨有一些该代码中的错误。我该如何解决这个问题。 示例代码如下:
Public Shared Function SomeFunction(ByVal iParam As Integer, Optional ByVal oColor As Color = Color.Black)
End Function
编译器不接受'= Color.Black'
答案 0 :(得分:19)
对于每个可选参数,您必须将常量表达式指定为 该参数的默认值。如果表达式求值为 没有,值数据类型的默认值用作 参数的默认值。
所以你不能使用那种语法,相反你可以写这样的东西
Private Sub Test(a As Integer, Optional c As Color = Nothing)
If c = Nothing Then
c = Color.Black ' your default color'
End If
......
End Sub
用C#编写的相同代码如下
private void Test(int a, Color c = default(Color))
{
if (c.IsEmpty)
c = Color.Black;
}
在C#中,您无法针对空值测试值类型(如颜色,点,大小等...)。这些类型永远不会为null,但它们具有类型的默认值(对于整数类似0),因此,如果需要为值类型传递可选参数,则可以使用new
关键字创建它您希望默认使用的值或使用default
keyword并让框架决定哪个值是该类型的默认值。如果您让框架选择,那么 IsEmpty 属性将为true。
答案 1 :(得分:6)
您可以重载方法
''' <summary>
''' requires two parameters
''' </summary>
''' <param name="a">an integer</param>
''' <param name="c">a color</param>
''' <remarks></remarks>
Private Sub Test(a As Integer, c As Color)
'Your function
End Sub
''' <summary>
''' one parameter, uses default color of black
''' </summary>
''' <param name="a">an integer</param>
''' <remarks></remarks>
Private Sub Test(a As Integer)
Test(a, Color.Black)
End Sub
答案 2 :(得分:1)
.NET颜色世界中还有另一个功能,可以使您实现自己的初衷。该功能是一个称为“ KnownColor”的枚举,它可以自由地来回转换为System.Drawing.Color对象。尽管它没有所有可能的颜色,但它具有我所需要的所有颜色。并且因为它是一个枚举,所以它在可选参数中具有“常量”作为默认值说明符。示例:
Private Sub Test(a As Integer, Optional kc As KnownColor = KnownColor.Black)
Dim MyColor As System.Drawing.Color = Color.FromKnownColor(kc)
......
End Sub
根据
https://docs.microsoft.com/en-us/dotnet/api/system.drawing.color.toknowncolor
如果通过使用FromName(String)方法或FromKnownColor(KnownColor)从预定义颜色创建颜色,则可以使用System.Drawing.Color.ToKnownColor()函数转换回KnownColor枚举中的值) 方法。否则它将返回值0。
答案 3 :(得分:0)
在Visual Basic中,@ Steve提出的解决方案几乎可以正常工作,但是将Color设置为Nothing并不能达到您通常期望的效果。检查需要是空色,而不是空色。这是一个例子。只要它具有.ForeColor,它就会闪烁Windows窗体控件的BackColor 50毫秒:
Sub Flash(c As Control, Optional FlashColor As Color = Nothing,
Optional Duration As Integer = 50)
If FlashColor.Equals(System.Drawing.Color.Empty) Then FlashColor = Color.Red
Try
Dim CurrColor = c.BackColor
c.BackColor = FlashColor
c.Refresh()
System.Threading.Thread.Sleep(Duration)
c.BackColor = CurrColor
c.Refresh()
Catch ex as Exception
End Try
End Sub