gpt4 book ai didi

c# - 仅用于 getter 的可空索引器参数

转载 作者:行者123 更新时间:2023-12-05 05:32:32 26 4
gpt4 key购买 nike

我有一个 Field<T>需要 Entity 的类(class)作为索引器参数:

class Entity { ... }

class Field<T>
{
T this[Entity? entity]
{
get
{
...
}
set
{
if (entity == null)
throw new ArgumentNullException(nameof(entity));
...
}
}
}

索引器 getter 应该允许 null Entity值,而 setter 不应该,如下所示(不幸的是它不编译):

class Field<T>
{
T this[Entity? entity] { get... }
T this[Entity entity] { set... }
}

这可能吗?

最佳答案

我不太确定您在示例代码中尝试做什么。您定义了 Entity作为一个类,这使它成为一个引用类型。您可以向编译器指示它是可为空的引用类型,但在内部类型是相同的。这与值类型不同,值类型与 ? 不同。 . (参见 here。)

所以 EntityEntity? 的类型相同,但是int -> System.Int32同时int? -> System.Nullable<System.Int32> .

由于索引器的定义方式,这一点很重要。 C# 规范说

The formal_parameter_list of an indexer defines the signature (§7.6) of the indexer. Specifically, the signature of an indexer consists of the number and types of its formal parameters. The element type and names of the formal parameters are not part of an indexer’s signature.

Section 14.9 Indexers

你的代码

T this[Entity? entity] { get... }
T this[Entity entity] { set... }

给出编译错误,因为两个签名相同。

您可以通过各种方式解决这个问题,并权衡取舍。您始终可以允许 null 并进行运行时检查以抛出异常。您可以删除 setter 和 getter 中的一个或两个,并将它们显式实现为方法调用(这样您将丢失 obj[index] 语法)。您可以更改 Entity到一个值类型并实现两个具有不同类型签名的不同索引器;以下示例。

namespace IndexerExample
{
public struct Entity
{
public int Id { get; set; }
}

public class Field<T>
{
private Dictionary<Entity, T> _values = new Dictionary<Entity, T>();

public T this[Entity? e]
{
get
{
if (!e.HasValue)
{
return default(T);
}

return _values[e.Value];
}
}

public T this[Entity e]
{
get
{
return _values[e];
}

set
{
if (_values.ContainsKey(e))
{
_values[e] = value;
}
else
{
_values.Add(e, value);
}
}
}
}

internal class Program
{
static void Main(string[] args)
{
var f = new Field<int>();
var e = new Entity() { Id = 3 };

f[e] = 9;
var x = f[null];
var y = f[e];
}
}
}

关于c# - 仅用于 getter 的可空索引器参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74063624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com