变化的一个相当基本的问题.鉴于此类:
public class X
{
public T A;
public T B;
public T C;
...
// (other fields, properties, and methods are not of interest here)
}
Run Code Online (Sandbox Code Playgroud)
我要寻找一个简洁的方式来编码,将返回所有的方法A,B,C,...这不是一个枚举集合空.(假设将这些字段声明为数组不是一种选择.)
public IEnumerable<T> GetAllNonNullABCs(this X x)
{
// ?
}
Run Code Online (Sandbox Code Playgroud)
这种方法的明显实现是:
public IEnumerable<T> GetAllNonNullABCs(this X x)
{
var resultSet = new List<T>();
if (x.A != null) resultSet.Add(x.A);
if (x.B != null) resultSet.Add(x.B);
if (x.C != null) resultSet.Add(x.C);
...
return resultSet;
}
Run Code Online (Sandbox Code Playgroud)
特别困扰我的是代码看起来冗长而重复,而且我List事先并不知道初始容量.
我希望有一种更聪明的方式,可能涉及 …
我今天注意到,如果你声明一个可以为空的DateTime对象,你就不会获得与拥有标准DateTime对象时相同的函数集.
例如:
DateTime? nullableDT = DateTime.Now;
DateTime regularDT = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,nullableDT不能使用以下任何功能:
ToFileTime
ToFileTimeUtc
ToLocalTime
ToLongDateString
ToLongTimeString
ToOADate
ToShortDateString
ToShortTimeString
ToString(IFormatProvider)
ToString(String)
ToString(String, IFormatProvider)
ToUniversalTime
Run Code Online (Sandbox Code Playgroud)
这是短名单,还有更多方法不可用.
为什么.NET表现得像这样?我绕过可以Convert.ToDateTime()约会的日期来解决这个问题,但这看起来很克服......有更好的方法吗?
可能重复:
为什么选项[T]?
引用类型提供特殊值,null表示"缺少值".值类型没有这样的值,这就是C#引入可选值类型(以及它们的特殊语法)的原因.
Scala的Option[T]有三种不同的"空"值:null,None和Some(null).在安全性和可表达性方面,这增加了多少复杂性给我们带来了什么?我什么时候使用哪个?
我使用了两个可以为空的int [] s:
int?[] OriginalPterodactylVals = new int?[NUMBER_OF_BABES_IN_TOYLAND];
int?[] ChangedPterodactylVals = new int?[NUMBER_OF_BABES_IN_TOYLAND];
Run Code Online (Sandbox Code Playgroud)
...和这个代码来同步它们:
ChangedPterodactylVals.CopyTo(OriginalPterodactylVals, 0);
Run Code Online (Sandbox Code Playgroud)
...但是现在我已经将int []更改为Lists并且还没有找到或想出如何完成同样的事情.
当一个"复制并粘贴"到另一个中时,它们在列表中都具有相同数量的值.
public static string ChangeDeviceState(int deviceID, DeviceState nextState)
{
bool temp1;
string temp = "";
return ChangeDeviceState(deviceID, nextState, temp1, temp, "", "", "", "", "");
}
public static string ChangeDeviceState(int deviceID, DeviceState nextState, out bool? isAccessToken, out String challengeOrToken, string accessToken, string serialNumber, string MACAddress, string deviceModel, string answer )
{
Run Code Online (Sandbox Code Playgroud)
我所要做的就是有另一种方法,其他参数不是必需的.我bool isAccessToken必须是可空的,challengeOrToken必须是一个out param.
我收到了非法的参数错误.
我真的不明白c#中的这些参数功能.任何帮助是极大的赞赏.
我正在尝试做这样的事情:
public class MySuperCoolClass<T>
{
public T? myMaybeNullField {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
这给了我错误:
错误CS0453:
T' must be a non-nullable value type in order to use it as type parameter泛型类型或方法System.Nullable'中的类型T'.
谢谢
对不起,如果它是一个愚蠢的问题,我试图更好地了解.Net中的Nullable类型.
从我注意到的微软源代码(使用ReSharper),我知道Nullable是一个结构,T需要是一个结构
public struct Nullable<T> where T : struct
Run Code Online (Sandbox Code Playgroud)
现在,我试着做这样的事情
public struct CustomNullable<T> where T : struct
{
}
public class CustomNullableClass<T> where T : struct
{
}
Run Code Online (Sandbox Code Playgroud)
我编译时遇到错误:
Nullable<int?> a = null;
Nullable<Nullable<int>> a1 = null;
Run Code Online (Sandbox Code Playgroud)
对于上面提到的代码,我得到一个错误'只有非可空值的类型可能是System.Nullable的基础',但是如何在Nullable类型中强制执行?
并为
CustomNullable<int?> a2 = null;
CustomNullableClass<int?> a3 = null;
Run Code Online (Sandbox Code Playgroud)
我得到一个错误'类型System.Nullable必须是非可空的值类型才能将其用作参数T'.
我现在有点困惑,有人可以帮我理解发生了什么或者我不明白的东西?
非常感谢提前.
编辑:如果结构是值类型而值类型不能为null,那么Nullable如何成为结构?
信用:消费者
有没有办法声明一个一元运算符,如'!??'
我想象这样的事情(非工作代码)
public bool operator !??<T> (this <T> item) {
return item != null;
}
Run Code Online (Sandbox Code Playgroud)
所以我会像这样使用它
// day is a value and might possibly be null
string greeting = name !?? "hello there " + name;
Run Code Online (Sandbox Code Playgroud)
我发现自己经常要做这种尴尬
// day is a value and might be null
string greeting = day != null ? "hello there " + name : "";
Run Code Online (Sandbox Code Playgroud)
在我提供的示例中相当清楚,但是当您使用getter/setter进行视图模型时,它会让人感到有些困惑,并且会增加错过逻辑错误的可能性.因此:
public DateTime? SearchDate {
get { return _searchDate; }
set { _searchDate = value != null ? value.Value : …Run Code Online (Sandbox Code Playgroud) Kotlin有很多功能(?.和!!.)处理可空类型.但是这个只是让我感到震惊 - 如果你不知道你是在处理可空或不可空类型呢?如果你有泛型类MyClass<T>,那么你只需要一些类型就可以了T.
Kotlin是否允许将"可空"运算符应用于泛型类型(T此处),类型是否可以在类(如T?)中变为可空,以及如果类将使用可空类型实例化,如果类似MyClass<String?>.它会**std::string在MyClass类型中导致可为空的可空(如指向C++中的指针 - )类型吗?
使用null-coalescing运算符在赋值表的赋值右侧单个问号的目的是什么?例:
var a = collection?.First()?.somePropA ?? new A();
Run Code Online (Sandbox Code Playgroud)