double.NaN
. Math.Pow(x, step * 2) / Fact((step * 2) + 1)
, т.к. факториал растет гораздо быстрее степенной функции и получилось так, что деление вернуло 0
decimal
вместо double
, но тогда придется писать свою функцию возведения в степень (Math.Pow
только с double работает) var typeToFunc = new Dictionary<Type, AddFunc>() {{typeof(int), IntAdd}, {typeof(Vector2), Vector2Add}};
var left = 123;
var right = 14455;
var result = Add(left, right);
Console.WriteLine($"Результат сложения {left} и {right} = {result}");
var leftVector = new Vector2(123, 55);
var rightVector = new Vector2(55, 111);
var resultVector = Add(leftVector, rightVector);
Console.WriteLine($"Результат сложения {leftVector} и {rightVector} = {resultVector}");
T Add<T>(T left, T right)
{
return ( T ) typeToFunc[typeof(T)](left, right);
}
object Vector2Add(object left, object right)
{
return ( Vector2 ) left + ( Vector2 ) right;
}
object IntAdd(object left, object right)
{
return (int) left + (int) right;
}
delegate object AddFunc(object left, object right);
var number = NumberOrVector2<int>.FromNumber(123);
var newNumber = number.Add(() => 23, () => throw new InvalidOperationException("хранится число"));
if (newNumber.TryGetNumber(out var result))
{
Console.WriteLine($"Получился результат: {result}");
}
else
{
Console.WriteLine($"Ошибка - хранился вектор");
}
public readonly struct NumberOrVector2<TNumber> where TNumber: unmanaged, INumber<TNumber>
{
private readonly TNumber _number;
private readonly Vector2? _vector;
private NumberOrVector2(TNumber number, Vector2? vector)
{
_number = number;
_vector = vector;
}
public bool TryGetNumber(out TNumber number)
{
number = _number;
return !_vector.HasValue;
}
public bool TryGetVector(out Vector2 vector)
{
vector = _vector.GetValueOrDefault();
return _vector.HasValue;
}
public NumberOrVector2<TNumber> Add(Func<TNumber> numberAdd, Func<Vector2> vectorAdd)
{
if (_vector is {} vector)
{
return new NumberOrVector2<TNumber>(_number, vector + vectorAdd());
}
return new NumberOrVector2<TNumber>(_number + numberAdd(), null);
}
public static NumberOrVector2<TNumber> FromNumber(TNumber number)
{
return new NumberOrVector2<TNumber>(number, null);
}
public static NumberOrVector2<TNumber> FromVector(Vector2 vector)
{
return new NumberOrVector2<TNumber>(default, vector);
}
}
Main()
генерируется компилятором, но преимущество - можно не заморачиваться над сигнатурой (например, можно влепить async/await и не менять void
на async Task
) Connect()
возвращается, когда установлено соединение, но само соединение все еще может находиться в очереди - то, что здесь и происходит.const int maxPartySize = 2;
var party = new List<TcpClient>();
var locker = new object();
var ip = IPAddress.Loopback;
var port = 50000;
var server = new TcpListener(ip, port);
server.Start(128);
Console.WriteLine("Сервер запущен..");
while (true)
{
var client = await server.AcceptTcpClientAsync();
_ = ProcessClientAsync(client);
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} подключен. Текущий размер группы: {party.Count}");
}
async Task ProcessClientAsync(TcpClient client)
{
await Task.Yield();
bool added;
lock (locker)
{
if (added = party.Count < maxPartySize)
{
party.Add(client);
}
}
if (added)
{
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} добавлен в группу");
}
else
{
Console.WriteLine($"Клиент {client.Client.RemoteEndPoint} НЕ добавлен в группу");
}
client.Close();
}
using TcpClient client = ...
иначе клиент закроется до начала его обработки Предпринята попытка использовать имя, которое не существует в классе, пространстве имен или области. Проверьте правильность написания имени и директивы using и ссылки на сборки, чтобы убедиться, что это имя доступно.
GameObject drinksSp = instantiate(drinks[drinkInt]);
instantiate
? Math.Round
, но зависит от того какое округление нужноvar value1 = 13.444;
var value2 = 13.446;
// С параметром MidpointRounding.ToNegativeInfinity - без мат. округления, просто отбрасываются
Console.WriteLine(Math.Round(value1, 2, MidpointRounding.ToNegativeInfinity)); // 13.44
Console.WriteLine(Math.Round(value2, 2, MidpointRounding.ToNegativeInfinity)); // 13.44
// Если нужно мат. округление
Console.WriteLine(Math.Round(value1, 2)); // 13.44
Console.WriteLine(Math.Round(value2, 2)); // 13.45
MidpointRounding
параметром User Id
и Password
на Integrated Security=SSPI;
DeclaringType
у Member
.Console.WriteLine(NameOf(( ) => SomeStatic.Value ));
static string NameOf<T>(Expression<Func<T>> path)
{
var members = new Queue<string>();
Expression? exp = path.Body;
while (exp is not null)
{
if (exp is MemberExpression memberExpression)
{
var prevName = memberExpression.Member.DeclaringType?.Name;
if (prevName is not null)
{
if (members.TryPeek(out var last) || last != prevName)
{
members.Enqueue(prevName);
}
}
members.Enqueue(memberExpression.Member.Name);
exp = memberExpression.Expression;
}
else
{
break;
}
}
return string.Join('.', members);
}
class SomeStatic
{
public static int Value { get; set; }
}
Зачем завершать процесс генерируя ошибку(token.ThrowIfCancellationRequested())?
Result
классы с шаблонными Cancelled
.Вот есть способ завершать задачу return-ном в методе задачи.
try-catch ресурса затратная конструкция
lock { }
сделать. Тебя компилятор поругает