我有一个像这样定义的泛型方法:
public void MyMethod<T>(T myArgument)
Run Code Online (Sandbox Code Playgroud)
我想要做的第一件事是检查myArgument的值是否是该类型的默认值,如下所示:
if (myArgument == default(T))
Run Code Online (Sandbox Code Playgroud)
但是这不能编译,因为我没有保证T将实现==运算符.所以我把代码改为:
if (myArgument.Equals(default(T)))
Run Code Online (Sandbox Code Playgroud)
现在这个编译,但是如果myArgument为null则会失败,这是我正在测试的一部分.我可以像这样添加一个显式的空检查:
if (myArgument == null || myArgument.Equals(default(T)))
Run Code Online (Sandbox Code Playgroud)
现在这让我感到多余.ReSharper甚至建议我将myArgument == null部分更改为myArgument == default(T),这是我开始的地方.有没有更好的方法来解决这个问题?
我需要支持两种引用类型和值类型.
我正在尝试检查是否已分配数组中的结构,但无法检查它或者它的数据为空。有什么方法可以检查它是否已分配吗?
结构:
[StructLayout(LayoutKind.Explicit)]
public struct CharInfo
{
[FieldOffset(0)]
public CharUnion Char;
[FieldOffset(2)]
public short Attributes;
}
Run Code Online (Sandbox Code Playgroud)
方法
public void render(){
for (int i = 0; i < (width * height - 1); i++) {
if (screenBuffer[i].Char.UnicodeChar != Convert.ToChar(" ")) {
ScreenDriver.screenBuffer[i] = screenBuffer[i];
}
}
// ScreenDriver.screenBuffer = screenBuffer;
}
Run Code Online (Sandbox Code Playgroud) 我有以下最小示例代码:
struct MyStruct
{
long Size;
}
MyStruct myStruct;
bool result;
if (someCondition)
{
result = API.SomeThirdPartyCall(out myStruct); // the call will set 'result' to 'true' and assign a value to 'myStruct'
}
if (result)
{
result = API.AnotherCall(myStruct); // <-- gives error "Use of possibly unassigned field 'myStruct' (CS0170)"
}
Run Code Online (Sandbox Code Playgroud)
我知道myStruct当我尝试使用该结构进行第二次 API 调用时,它已被分配了一个值。该API是由第三方提供的,我无法更改它。有什么方法可以忽略我的字段可能未定义的错误吗?
我知道有一些类似的问题,例如How to check if a struct has been instanciated,但解决方案是使用可为空的结构,这对我来说不是一个选择,因为 API 不会接受可为空的结构。