阅读本文,我了解到有可能允许方法通过使其成为通用方法来接受多种类型的参数.在该示例中,以下代码与类型约束一起使用以确保"U"是一个IEnumerable<T>.
public T DoSomething<U, T>(U arg) where U : IEnumerable<T>
{
return arg.First();
}
Run Code Online (Sandbox Code Playgroud)
我发现了一些允许添加多个类型约束的代码,例如:
public void test<T>(string a, T arg) where T: ParentClass, ChildClass
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
然而,这个代码出现到强制执行arg必须是一个类型的ParentClass 和 ChildClass.我想要做的是说arg可以是一种类型ParentClass 或 ChildClass以下列方式:
public void test<T>(string a, T arg) where T: string OR Exception
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
一如既往地感谢您的帮助!
我想限制一个通用的我编码到任何可能的null.这基本上是任何类+ System.Nullable(例如int?等等).
对于课堂部分,它很容易:
public class MyGeneric<T> where T : class {}
Run Code Online (Sandbox Code Playgroud)
但是,这不允许我这样做:
var myGeneric = new MyGeneric<int?>();
Run Code Online (Sandbox Code Playgroud)
或这个:
var myGeneric = new MyGeneric<Nullable<int>>();
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:
错误CS0452:类型'int?' 必须是引用类型才能在泛型类型或方法'Test.MyGeneric'中将其用作参数'T'
所以我尝试将addind System.Nullable作为可接受的类型T:
public class MyGeneric<T> where T : class, System.Nullable {}
Run Code Online (Sandbox Code Playgroud)
但它不会这样做.编译器返回以下错误:
错误CS0717:'System.Nullable':静态类不能用作约束
然后我试过了
public class MyGeneric<T> where T : class, INullable {}
Run Code Online (Sandbox Code Playgroud)
它确实编译,但是当我这样做时:
var myGeneric = new MyGeneric<string>();
Run Code Online (Sandbox Code Playgroud)
编译器返回此错误:
错误CS0311:类型'string'不能用作泛型类型或方法'Test.MyGeneric'中的类型参数'T'.没有从'string'到'System.Data.SqlTypes.INullable'的隐式引用转换.
所以,问题是:是否有可能将泛型限制为任何可能的null,以及如何?
作为参考,我使用的是VS2010/C#4.0
编辑
我被问到我想用它做什么.这是一个例子:
namespace Test
{
public class MyGeneric<T> where T : …Run Code Online (Sandbox Code Playgroud) 我正在 C# 8.0 中设计一个nullable启用的接口,目标是 .Net Standard 2.0(使用Nullable 包)和 2.1。我现在面临这个问题T?。
在我的示例中,我正在为缓存构建一个接口,该接口存储Stream由string键标识的 s/字节数据,即文件系统可以通过一个简单的实现。每个条目还由一个版本标识,该版本应该是通用的。例如,此版本可以是另一个string键(如 etag)、 anint或 a date。
public interface ICache<TVersionIdentifier> where TVersionIdentifier : notnull
{
// this method should return a nullable version of TVersionIdentifier, but this is not expressable due to
// "The issue with T?" https://devblogs.microsoft.com/dotnet/try-out-nullable-reference-types/
Task<TVersionIdentifier> GetVersionAsync(string file, CancellationToken cancellationToken = default);
// TVersionIdentifier should be not nullable here, which is what we …Run Code Online (Sandbox Code Playgroud)