- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下代码:
function f {
param (
[AllowNull()]
[string]
$x
)
return $x
}
$r = f -x $null
$null
转换为
[string]::Empty
到时候
return
到达了。
$null
不同于
[string]::Empty
我想保留这种区别。我也更愿意保留
$x
如类型
[string]
因为
$x
仅作为字符串有意义,并且该接口(interface)在其他地方使用。
$x
出来为 $null
当它通过时$null
? $x
已通过 $null
不是 [string]::Empty
从内部 f
? [int]
的相同概念:
function f {
param(
[System.Nullable[int]]$x
)
return $x
}
$r = f -x $null
$r
确实是
$null
.
$x
可以是
$null
或
[int]
但没有别的。必须允许任何对象才能传递
$null
对我来说似乎很奇怪。或
[int]
.
[System.Nullable[string]]
产生一个错误,归结为
[System.Nullable[T]]
要求
[T]
是值类型。
[string]
是引用类型,因此不起作用。
$null
不会导致转换为除
[string]
之外的任何类型的参数.我已经测试了以下内容:
function f { param([System.Nullable[int]]$x) $x }
function f { param([System.Nullable[System.DayOfWeek]]$x) $x }
function f { param([hashtable]$x) $x }
function f { param([array]$x) $x }
function f { param([System.Collections.Generic.Dictionary[string,int]]$x) $x }
function f { param([System.Collections.ArrayList]$x) $x }
function f { param([System.Collections.BitArray]$x) $x }
function f { param([System.Collections.SortedList]$x) $x }
function f { param([System.Collections.Queue]$x) $x }
function f { param([System.Collections.Stack]$x) $x }
$null
对这些函数中的任何一个输出 $null。我还没有找到传递的唯一参数类型
$null
没有转换是
[string]
.
public string f(string x)
{
return x;
}
f(null)
返回
null
.
[NullString]::Value
was intended to address this problem.我好像工作通过
null
至
string
C# API 中的参数。然而,
[NullString]::Value
转换为
[string]::empty
在 PowerShell 中与
$null
相同.考虑以下代码:
function f {
param (
[AllowNull()]
[string]
$x
)
return $x
}
$r = f -x ([NullString]::Value)
$r.GetType().Name
String
.
$r
是
[string]::Empty
尽管如此
[NullString]::Value
已传递给
$x
.
This is by design and ... changing the behavior would be a massive breaking change.
If your parameter needs to differentiate between 3 values: $true, $false and “unspecified”, then define a parameter of type Nullable. The need for a 3rd, "unspecified" value typically occurs when the cmdlet can modify a Boolean property of an object. In this case "unspecified" means to not change the current value of the property.
最佳答案
总结和补充问题、答案和评论中的信息:
tl;博士 :
最好不要对抗 PowerShell 不允许的设计 [string]
变量为 $null
,并限制使用 [NullString]::Value
调用 .NET 方法。
$null
至 ''
(空字符串)当它被分配给 [string]
时-typed [参数] 变量,参数变量也默认为 ''
. [string]
PSv5+ 自定义类中的属性,正如 alxr9(OP)指出的那样:class c { [string] $x }; $null -eq ([c]::new()).x
确实产生 $True
暗示该属性(property).x
包含 $null
.然而,这个异常很可能是偶然的,probably a bug ,考虑到当您使用 $null
初始化属性时或分配 $null
稍后,转换为''
再次开始;同样,使用 return $null
来自 [string]
-typed 方法输出 ''
.null
直接,默认为 null
在某些情况下。 string
是 .NET 引用类型,此行为适用于所有引用类型。null
,因此不需要通过 System.Nullable`1
单独的可为空的包装器,这确实不受支持(它仅适用于值类型)。[NullString]::Value
在 v3 中专门针对 引入允许通过 null
至 string
.NET 方法的参数 - 虽然没有明确阻止或阻止在纯 PowerShell 代码中使用,但更新 4 中的意外行为和核心 PowerShell 团队成员(见下文)的评论表明,这种使用是没有预料到的。[NullString]::Value
在纯 PowerShell 代码中,考虑到 ,可能存在超出下面讨论的陷阱。使用 [NullString]::Value
从未打算在调用 .NET 方法的上下文之外使用 ;至 quote a core member of the PowerShell team :Parameters to C# methods was the target scenario for
[NullString]::Value
, and I will say that might be the only reasonable scenario.
[object]
或到 不限制类型 完全一样。这样的变量愉快地接受 $null
,但请注意 您可能需要字符串化(转换为 [string]
)非 $null
重视自己 (尽管 PowerShell 在显式或隐式字符串上下文中自动为您执行此操作) - 请参阅下面的倒数第二个代码示例。 [string]
可以传递的参数变量$null
至通过 [NullString]::Value
,就像您问题中的更新 4 一样,有一个 - 晦涩的 -
解决方法 为
the optimization bug由于
PetSerAl 的侦查,这会阻止您的代码工作:
function f {
param (
[string] $x
)
# Workaround; without this, even passing [NullString]::Value
# returns '' rather than $null
if ($False) { Remove-Variable }
return $x
}
$r = f -x ([NullString]::Value)
$r.GetType().Name # now fails, because $r is $null
注意分配/传递时
[NullString]::Value
到
[string]
-typed [参数] 变量,立即转换为
$null
(在参数变量的情况下,仅当错误得到修复或解决方法到位时)。
$null
已经以这种方式成功存储在变量中,它显然可以这样传递(同样,只有在错误得到修复或解决方法到位时)。
[NullString]::Value
而不是
$null
,您可以通过
Curios 建立答案和
Jason Schnell , 依赖于
使用无类型(隐式 [object]
类型)或显式 [object]
-typed 参数,可以接受 $null
原样 :
function f {
param (
[AllowNull()] # Explicitly allow passing $null.
# Note: Strictly speaking only necessary with [Parameter(Mandatory=$True)]
$x # Leave the parameter untyped (or use [object]) so as to retain $null as-is
)
# Convert $x to a type-constrained [string] variable *now*:
if ($null -eq $x) {
# Make $x contain $null, despite being [string]-typed
[string] $x = [NullString]::Value
} else {
# Simply convert any other type to a string.
[string] $x = $x
}
# $x is now a bona fide [string] variable that can be used
# as such even in .NET method calls.
return $x
}
有点麻烦,但是可以让调用者通过
$null
直接(或任何字符串,或将转换为字符串的任何其他实例的类型)。
$PSBoundParameters
:
function f {
param (
[string] $x
)
if ($PSBoundParameters.ContainsKey('x')) { # Was a value passed to parameter -x?
"-x argument was passed: $x"
} else {
"no -x argument passed."
}
}
如上所述,这仅适用于省略情况(因此根本不适用于强制性参数)。如果您通过
$null
,通常转换为
''
开始,你将无法区分通过
$null
和
''
.
[NullString]::Value
以有效传递
$null
,甚至使用
[NullString]::Value
作为参数默认值。)
关于string - 绑定(bind)到参数时,如何防止字符串参数从 null 更改为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45720150/
如果您想使用 String.Concat() 连接 5 个或更多字符串,则它会使用 Concat(String[])。 为什么不一直使用 Concat(String[]) 而不再需要 Concat(S
今天在使用 String 时,我遇到了一种我以前不知道的行为。我无法理解内部发生的事情。 public String returnVal(){ return "5";
似乎在我所看到的任何地方,都有一些过时的版本,这些版本不再起作用。 我的问题似乎很简单。我有一个Java类,它映射到derby数据库。我正在使用注释,并且已经成功地在数据库中创建了所有其他表,但是在这
一、string::size_type() 在C++标准库类型 string ,在调用size函数求解string 对象时,返回值为size_type类型,一种类似于unsigned类型的int 数据
我正在尝试将数据保存到我的 plist 文件中,其中包含字符串数组的定义。我的plist - enter image description here 我将数据写入 plist 的代码是 -- let
我有一个带有键/值对的 JavaScript 对象,其中值是字符串数组: var errors = { "Message": ["Error #1", "Error #2"], "Em
例如,为了使用相同的函数迭代 List 和 List> ,我可以编写如下内容: import java.util.*; public class Test{ public static voi
第一个Dictionary就像 Dictionary ParentDict = new Dictionary(); ParentDict.Add("A_1", "1")
这是我的 jsp 文件: 我遇到了错误 The method replace(String, String, String) in the type Functions is not appl
我需要一些帮助。我有一个方法应该输出一个包含列表内容的 txt 文件(每行中的每个项目)。列表项是字符串数组。问题是,当我调用 string.Join 时,它返回文字字符串 "System.Strin
一位同事告诉我,使用以下方法: string url = "SomeURL"; string ext = "SomeExt"; string sub = "SomeSub"; string s
给定类: public class CategoryValuePair { String category; String value; } 还有一个方法: public
我正在尝试合并 Stream>>对象与所有 Streams 中的键一起映射到单个映射中. 例如, final Map someObject; final List>> list = someObjec
在这里使用 IDictionary 的值(value)是什么? 最佳答案 使用接口(interface)的值(value)始终相同:切换到另一个后端实现时,您不必更改客户端代码。 请考虑稍后分析您的代
我可以知道这两个字典声明之间的区别吗? var places = [String: String]() var places = [Dictionary()] 为什么当我尝试以这种方式附加声明时,只有
在 .NET 4.0 及更高版本中存在 string.IsNullOrWhiteSpace(string) 时,在检查字符串时使用 string.IsNullOrEmpty(string) 是否被视为
这个名字背后的原因是什么? SS64在 PowerShell 中解释此处的字符串如下: A here string is a single-quoted or double-quoted string
我打算离开 this 文章,尝试编写一个接受字符串和 &str 的函数,但我遇到了问题。我有以下功能: pub fn new(t_num: S) -> BigNum where S: Into {
我有一个结构为 [String: [String: String]] 的多维数组。我可以使用 for 循环到达 [String: String] 位,但我不知道如何访问主键(这个位 [String:
我正在尝试使用 sarama(管理员模式)创建主题。没有 ConfigEntries 工作正常。但我需要定义一些配置。 我设置了主题配置(这里发生了错误): tConfigs := map[s
我是一名优秀的程序员,十分优秀!