【发布时间】:2019-09-09 16:06:28
【问题描述】:
根据https://github.com/dotnet/csharplang/blob/master/proposals/csharp-8.0/nullable-reference-types-specification.md object 现在是一个有效的类型约束。
可空引用类型可用作通用约束。此外,对象现在作为显式约束有效。没有约束现在就等同于一个对象?约束(而不是对象),但是(与之前的对象不同)对象?不作为显式约束被禁止。
我认为这应该可以正确编译,但 Visual Studio 不允许我编译它。
public class A<T> where T : object { }
我是误读了这个还是 VS 或 C#8 的问题?
更新
我正在尝试为缓存定义一个接口。
public interface IDataCache
{
void Put<T>(string key, T value) where T : notnull;
T? Get<T>(string key) where T : notnull;
}
理想情况下,我不希望缓存空值,但我也不能保证缓存中会有一个值。有时我想缓存一个类,但有时它可能是一个整数。这可能实现还是我必须为每种情况制定单独的方法?
public interface IDataCache
{
void Put<T>(string key, T value) where T : notnull;
// This seems really nasty!
T? GetClass<T>(string key) where T : class;
T? GetStruct<T>(string key) where T : struct;
}
【问题讨论】:
-
"/proposals"。 “这是一项正在进行的工作 - 有几个部分缺失或不完整。”
-
“对象泛型类型约束”功能目前处于预览状态,目前“不受支持”。要使用预览功能,请使用“预览”语言版本。
-
@R.J.Dunnill 相反,C# 8 和 .NET Core 3 在过去几个月都获得了 Go Live 许可证,距离最终版本只有 2 周的时间。人们已经在生产中使用它。这是一个有效的问题 - 该功能是否适用于 C# 8?
-
这是一个很好的问题——如何在泛型中指定可空性? C# 8 已经拥有 Go Live 许可证,因此它受支持。该功能仍然存在,但语法不同
-
@Panagiotis Kanavos 这是 Visual Studio 2019 给我的错误文本。
标签: c# visual-studio c#-8.0 nullable-reference-types