[英]A C# function that returns a nullable type for any T - reference or value
簡短版本:我可以在 C# 中定義一個為任何給定T
類型返回null
的函數嗎? 現在,我基本上必須使用兩個不同的函數:
private static Nullable<T> GetNullForValueType<T>() where T : struct {
return null;
}
private static T? GetNullForRefType<T>() where T : class {
return null;
}
問題:有沒有辦法將它們合並為一個?
長版
我有一個從文本文件加載值的應用程序。 我使用一組加載不同類型值的值加載器。 我想讓這些加載器可組合,例如“Required”或“Nullable”或“ContainsOneOfTheseValues”等。這是一個單元測試來演示:
namespace TestProject1;
public class UnitTest1 {
private static Func<string, Nullable<T>> NullableValueTypeLoader<T>(Func<string, T> innerLoader) where T : struct {
return (String text) => string.IsNullOrWhiteSpace(text) ? default(T?) : innerLoader(text);
}
private static Func<string, T?> NullableRefTypeLoader<T>(Func<string, T> innerLoader) where T : class {
return (String text) => string.IsNullOrWhiteSpace(text) ? null : innerLoader(text);
}
private string StringLoader(string text) {
return text.Trim();
}
private int IntLoader(string text) {
return int.Parse(text);
}
[Fact]
public void Test1() {
Assert.Equal(123, IntLoader("123"));
Assert.Equal("xyz", StringLoader(" xyz "));
Assert.Null(NullableValueTypeLoader(IntLoader)(""));
Assert.Null(NullableRefTypeLoader(StringLoader)(""));
}
}
問題:有沒有辦法重寫它,以便我可以使用一個可以同時處理值和引用類型的Nullable
函數?
我在使用 C# 10。一旦 Rider 更好地支持 .net 7,就可以升級到 11。
我可以在 C# 中定義一個為任何給定 T 類型返回 null 的函數嗎
不,它們是不同的類型。
然而, default
應該通過改變你的函數實現更對稱來讓你到達那里:
private static Func<string, T?> NullableValueTypeLoader<T>(Func<string, T> innerLoader) where T : struct =>
text => string.IsNullOrWhiteSpace(text) ? default : (T?)innerLoader(text);
private static Func<string, T?> NullableRefTypeLoader<T>(Func<string, T> innerLoader) where T : class =>
text => string.IsNullOrWhiteSpace(text) ? default : innerLoader(text);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.