作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了两个抽象类来代表实体的基类:一个是 Id
属性是 整数 , 另一个允许指定 Id
的类型使用泛型类型参数的属性 TId
:
/// <summary>
/// Represents the base class for all entities.
/// </summary>
[System.Serializable]
public abstract class BaseEntity
{
/// <summary>
/// Gets or sets the ID of the entity.
/// </summary>
public int Id { get; set; }
}
/// <summary>
/// Represents the base class for all entities that have an ID of type <typeparamref name="TId"/>.
/// </summary>
/// <typeparam name="TId">
/// The type of the <see cref="Id"/> property.
/// </typeparam>
[System.Serializable]
public abstract class BaseEntity<TId>
{
/// <summary>
/// Gets or sets the ID of the entity.
/// </summary>
public TId Id { get; set; }
}
BaseEntity<TId>
,编译器给出警告:
Non-nullable property 'Id' is uninitialized. Consider declaring the property as nullable.
System.String
,即 BaseEntity<string>
BaseEntity<System.Guid>
或自定义结构 System.String
不是值类型,这似乎是不可能的:如果我约束
TId
对于结构(
BaseEntity<TId> where TId : struct
),我不能声明
BaseEntity<string>
不再。
Id
属性及其默认值并使用
!
运算符(operator):
/// <summary>
/// Represents the base class for all entities that have an ID of type <typeparamref name="TId"/>.
/// </summary>
/// <typeparam name="TId">
/// The type of the <see cref="Id"/> property.
/// </typeparam>
[System.Serializable]
public abstract class BaseEntity<TId>
{
/// <summary>
/// Gets or sets the ID of the entity.
/// </summary>
public TId Id { get; set; } = default!;
}
TId
可以是值类型(例如,短、长、
System.Guid
、...)、
或 一个
System.String
.
最佳答案
不,没有这样的约束——无论您是否使用可为空的引用类型。
您可能会做的是使用私有(private)构造函数来确保只有在基类型中声明的类型才能从 BaseEntity
派生。 ,然后使用两个特定版本:
public abstract class BaseEntity<TId>
{
public TId Id { get; set; }
private BaseEntity<TId>(Id id) => Id = id;
public class StructEntity<T> : BaseEntity<T> where T : struct
{
public StructEntity() : base(default) {}
}
public class StringEntity : BaseEntity<string>
{
public StringEntity(string id) : base(id) {}
}
}
BaseEntity<T>
在大多数地方,但任何时候你想构建一个实体,你都需要在这两者之间进行选择。
关于generics - 与 C# 8.0 可空引用类型结合时,是否可以为值或字符串类型声明泛型类型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59933006/
我是一名优秀的程序员,十分优秀!