簡體   English   中英

為任何 T - 引用或值返回可空類型的 C# 函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM